Java TreeSet - не удалять повторяющиеся элементы

TreeSet удаляет разные элементы с тем же значением Comprator. Я не хочу, чтобы его удаляли. Есть ли способ контролировать это? Или использовать другой контейнерный класс?

Добавлено: ОК. Кажется, я не могу использовать Set. Мне нужна функция сортировки вставки для рассмотрения производительности. Может ли это сделать? Спасибо всем.

Ответ 1

Набор по определению не может иметь повторяющиеся записи.

Итак, вам нужно использовать List или Array или такой

Ответ 2

Даже это набор, это все еще запутывает, потому что объекты разные. Например, 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;
}

Ответ 3

Основной целью Set является отсутствие дубликатов. Вы либо не хотите Set, либо вам нужен другой Comparator.

Ответ 4

Цитата из Javadoc для Set:

Коллекция, которая не содержит повторяющихся элементов

Используйте любую производную List.

Ответ 5

Если вы хотите 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;
    }
}

Надеюсь, у меня есть все функции, которые могут потребовать сортировки. (Удалить не нужно переопределять)