Ответ 1
Набор по определению не может иметь повторяющиеся записи.
Итак, вам нужно использовать List или Array или такой
TreeSet удаляет разные элементы с тем же значением Comprator. Я не хочу, чтобы его удаляли. Есть ли способ контролировать это? Или использовать другой контейнерный класс?
Добавлено: ОК. Кажется, я не могу использовать Set. Мне нужна функция сортировки вставки для рассмотрения производительности. Может ли это сделать? Спасибо всем.
Набор по определению не может иметь повторяющиеся записи.
Итак, вам нужно использовать List или Array или такой
Даже это набор, это все еще запутывает, потому что объекты разные. Например, Set<E>
для разных объектов E
будет отбрасывать некоторые объекты при преобразовании в TreeSet<E>
на основе используемого Comparator<E>
. В обоих случаях это набор, но набор сохраненных элементов будет другим. По-моему, это хорошо не уточняется в документах.
Простое решение, если вы можете изменить Компаратор, пусть он не возвращает 0. Например, вместо:
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
Использование:
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? -1: 1;
}
Основной целью Set
является отсутствие дубликатов.
Вы либо не хотите Set
, либо вам нужен другой Comparator
.
Цитата из Javadoc для Set:
Коллекция, которая не содержит повторяющихся элементов
Используйте любую производную List.
Если вы хотите SortedList, вы можете, например, взять список и вручную вызвать Collections.sort() после каждой вставки.
Или вы переносите, например. ArrayList, чтобы обеспечить сортировку вызовов:
class SortedArrayList extends ArrayList<String> {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void add(int index, String element) {
super.add(index, element);
Collections.sort(this);
}
@Override
public boolean add(String element) {
boolean returnValue = super.add(element);
Collections.sort(this);
return returnValue;
}
@Override
public boolean addAll(Collection<? extends String> c) {
boolean returnValue = super.addAll(c);
Collections.sort(this);
return returnValue;
}
@Override
public boolean addAll(int index, Collection<? extends String> c) {
boolean returnValue = super.addAll(index, c);
Collections.sort(this);
return returnValue;
}
@Override
public String set(int index, String element) {
String returnValue = super.set(index, element);
Collections.sort(this);
return returnValue;
}
}
Надеюсь, у меня есть все функции, которые могут потребовать сортировки. (Удалить не нужно переопределять)