Есть ли существующая реализация List
на Java, которая поддерживает заказ на основе предоставленных Comparator
?Реализация списка, поддерживающая заказ
Что-то, что может быть использовано следующим образом:
Comparator<T> cmp = new MyComparator<T>();
List<T> l = new OrderedList<T>(cmp);
l.add(someT);
так, что someT
получает вставляется таким образом, что порядок в списке осуществляется в соответствии с cmp
(На @andersoj внушения я завершаю мой вопрос с еще одним запросом)
Также я хочу, чтобы иметь возможность перемещать список в отсортированном порядке без удаления элементов, то есть:
T min = Const.SMALLEST_T;
for (T e: l) {
assertTrue(cmp.compare(min, e) >= 0);
min = e;
}
должно пройти.
Все предложения приветствуются (кроме говоря мне использовать Collections.sort
на неупорядоченный полный список), хотя я предпочел бы что-то в java.*
или в конце концов org.apache.*
, так как это было бы трудно представить новые библиотеки в данный момент.
Примечание: (UPDATE4) я понял, что реализация такого рода списка будет иметь недостаточную производительность. Там два общих подхода:
- Использование Linked структура (вид) B-дерево или аналогичные
- Использование массива и вставки (с двоичным поиском)
Нет 1. имеет проблемы с промахов кэша процессора Нет 2. проблема с перемещением элементов в массиве.
UPDATE2: TreeSet
не работает, потому что он использует прилагаемый компаратор (MyComparator
) для проверки равенства и основанного на нем предполагается, что они равны, и исключить их. Мне нужна, что компаратор только для заказа, а не «уникальности» фильтрация (поскольку элементы по их естественному порядку не равны)
Update3: PriorityQueue
не работает, как List
(как мне нужен), потому что есть никоим образом не перемещать его в порядке «сортировка», чтобы получить элементы в отсортированном порядке, которые вы должны удалить из коллекции.
UPDATE:
Похожий вопрос:
A good Sorted List for Java
Sorted array list in Java
Это поведение нарушит договор «Список» и, как правило, будет «Плохой идеей». (Гува рассмотрел и отклонил такие возможности.) –
Какая часть контракта «Список» будет нарушена? –
Спецификация 'add (E)' говорит «Добавляет указанный элемент в конец этого списка». Добавление его в другое место в списке нарушает договор. –