2015-11-11 4 views
2

В Java у меня есть ArrayList со списком объектов. У каждого объекта есть поле даты, которое является просто длинным типом данных. ArrayList сортируется по полю даты. Я хочу вставить новый объект в ArrayList, чтобы он отображался в правильной позиции относительно его даты. Единственное решение, которое я вижу, это перебрать все элементы и сравнить поле даты объекта, вставляемого в объекты, которые повторяются, а затем вставить его, как только я доберусь до правильной позиции. Это будет проблемой производительности, если мне придется вставить много записей.Самый быстрый способ найти элемент в отсортированном ArrayList

Каковы возможные способы улучшения этой производительности? Может быть, ArrayList не лучшее решение?

+3

Вы можете использовать бинарный поиск, чтобы найти точку вставки. – dsharew

+1

Specifcally, ['Collections.binarySearch()'] (http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#binarySearch (java.util.List,% 20T, % 20java.util.Comparator)). Но нет, ArrayList, скорее всего, не лучшая структура для этого. –

+0

Возможно, вам захочется рассмотреть возможность использования другого типа коллекции, возможно, 'TreeSet' и сделать ваши элементы' Comparable'. Затем вы получаете все из коробки. –

ответ

3

Я бы сказал, что вы правильно сделать заявление:

Может быть, ArrayList не является лучшим решением

Лично я считаю, что структура дерева будет лучше подходит для этого , В частности, Дерево двоичного поиска, которое сортируется по времени времени объекта. Когда вы создадите дерево, вы можете использовать бинарный поиск, который принимает O (log n) раз.

+0

Для этой цели существует «TreeSet» в Java. –

0

Я бы подумал использовать TreeSet и сделать свой предмет: Comparable. Затем вы получаете все из коробки.

Если это невозможно, я бы искал индекс через Collections.binarySearch(...).

EDIT: Убедитесь, что производительность является проблемой, прежде чем приступить к оптимизации

+1

Не думайте о производительности, пока не узнаете, что это проблема ?! Определенно не согласен с тобой. Это похоже на то, что вы не получите крепкую веревку, чтобы идти скалолазанием, если не думаете, что вам это понадобится. Лучше создать эффективный код в первый раз, вместо того, чтобы возвращаться и менять его после того, как это проблема. –

+2

Настоящий совет «всегда думайте о производительности, но не угадайте --- меру». –

+0

Марко понял.Я просто видел, как многие люди делали уродливые вещи только для повышения производительности, которые оказались не нужны или не были полезными для производительности ... –

1

ли не бинарный поиск + O (п) вставки плохо для вас, зависит, по крайней мере, эти вещи:

  • размер перечня,
  • шаблон доступа (в основном вставка или в основном прочитанная),
  • соображения пространства (ArrayList гораздо более компактны, чем альтернативы).

Учитывая наличие этих факторов и их довольно сложных взаимодействий вы не должны переключиться на бинарное дереве поиска решения на основе, пока вы не узнаете, как плохо ваш текущий дизайн — через измерение. Переключатель может даже ухудшить ситуацию для вас.

Смежные вопросы