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