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

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

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

5 ответов


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

поэтому вам нужно использовать список или массив или такой


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

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

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


Если вы хотите SortedList, вы можете, например, взять список и вручную вызвать коллекции.сортировка () после каждой вставки.

или вы обертываете, например, 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;
    }
}

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