TreeSet - не удаляйте дублирующиеся элементы - PullRequest
11 голосов
/ 05 мая 2011

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

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

Ответы [ 5 ]

10 голосов
/ 05 мая 2011

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

Поэтому вам нужно использовать List или Array или что-то подобное

5 голосов
/ 27 августа 2016

Даже если это набор, это все еще сбивает с толку, потому что объекты разные.Например, Set<E> различных объектов E отбрасывает некоторые объекты при преобразовании в TreeSet<E> на основе используемого Comparator<E>.В обоих случаях это набор, но набор хранимых элементов будет другим.На мой взгляд, это не очень понятно в документах.

Простое решение, если вы можете изменить Comparator, пусть он не возвращает 0. Например, вместо:

public int compare(Integer o1, Integer o2) {
    return o1.compareTo(o2);
}

Использование:

public int compare(Integer o1, Integer o2) {
    return o1 < o2 ? -1: 1;
}
4 голосов
/ 05 мая 2011

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

3 голосов
/ 05 мая 2011

Цитата из Javadoc для набора:

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

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

1 голос
/ 13 июля 2015

Если вам нужен 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;
    }
}

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

...