Я сбит с толку, что не могу найти на это быстрого ответа. По сути, я ищу структуру данных на Java, которая реализует java.util.List
интерфейс, но хранит свои элементы в отсортированном порядке. Я знаю, что вы можете использовать нормальный ArrayList
и использовать Collections.sort()
его, но у меня есть сценарий, в котором я иногда добавляю и часто извлекаю участников из своего списка, и я не хочу, чтобы ему приходилось сортировать его каждый раз, когда я извлекаю член в случае, если добавлен новый. Может ли кто-нибудь указать мне на такую вещь, которая существует в JDK или даже сторонних библиотеках?
РЕДАКТИРОВАТЬ : структура данных должна будет сохранять дубликаты.
РЕЗЮМЕ ОТВЕТА : Я нашел все это очень интересным и многому научился. В частности, Aioobe заслуживает упоминания за его настойчивость в попытках достичь моих требований выше (в основном, отсортированная реализация java.util.List, которая поддерживает дубликаты). Я принял его ответ как наиболее точный из того, о чем я спрашивал, и как наводящий на большинство размышлений о последствиях того, что я искал, даже если то, что я спросил, было не совсем тем, что мне нужно.
Проблема с тем, о чем я просил, заключается в самом интерфейсе List и концепции дополнительных методов в интерфейсе. Процитируем javadoc:
Пользователь этого интерфейса имеет точный контроль над тем, где в списке будет вставлен каждый элемент.
Вставка в отсортированный список не дает точного контроля над точкой вставки. Затем вы должны подумать, как вы будете обрабатывать некоторые методы. Взять, add
к примеру:
публичное логическое добавление (объект o)
Appends the specified element to the end of this list (optional operation).
Теперь вы оказались в неудобной ситуации: 1) разорвать контракт и реализовать отсортированную версию добавления 2) разрешить add
добавить элемент в конец списка, нарушив ваш отсортированный порядок 3) оставив add
(как необязательный), выбрасывая an UnsupportedOperationException
и реализует другой метод, который добавляет элементы в отсортированном порядке.
Вариант 3, вероятно, лучший, но я считаю неприятным наличие метода добавления, который вы не можете использовать, и другого метода sortedAdd, которого нет в интерфейсе.
Другие связанные решения (в произвольном порядке):
- java.util.PriorityQueue, который, вероятно, ближе всего к тому, что мне нужно, чем то, что я просил. Очередь - не самое точное определение коллекции объектов в моем случае, но функционально она делает все, что мне нужно.
- net.sourceforge.nite.util.SortedList . Однако эта реализация нарушает контракт интерфейса List, реализуя сортировку в
add(Object obj)
методе, и, как ни странно, не имеет никакого эффекта для методаadd(int index, Object obj)
. По общему мнению,throw new UnsupportedOperationException()
этот сценарий может быть лучшим выбором. - TreeMultiSet Guava Реализация набора, поддерживающая дубликаты
- ca.odell.glazedlists.SortedList Этот класс содержит оговорку в своей документации javadoc:
Warning: This class breaks the contract required by List