14 Stimmen

java TreeSet - doppelte Einträge nicht entfernen

TreeSet entfernt verschiedene Elemente mit demselben Comprator-Wert. Ich möchte nicht, dass sie entfernt werden. Gibt es eine Möglichkeit, dies zu kontrollieren? Oder eine andere Containerklasse verwenden?

Hinzugefügt: OK. Es scheint, dass ich Set nicht verwenden kann. Ich brauche eine Sortierfunktion für die Einfügung, aus Leistungsgründen. Kann List dies tun? Vielen Dank an alle.

6 Stimmen

Verwenden Sie einen Comparator, der nicht 0 zurückgibt.

1 Stimmen

@Peter Lawrey Anders als bei Objekten, die in gewisser Weise identisch sind.

0 Stimmen

@Tom Hawtin, einverstanden, Sie könnten 0 zurückgeben, wenn die Objekte == vergleichen Sie sonst die System.identityHashCode() oder geben Sie einfach eine beliebige 1 für Objekte, die denselben Inhalt haben, aber nicht dasselbe Objekt sind.

11voto

Heiko Rupp Punkte 29262

Ein Set kann per Definition keine doppelten Einträge haben.

Sie müssen also eine Liste oder ein Array oder ähnliches verwenden

6voto

deepkimo Punkte 3167

Auch wenn es sich um einen Satz handelt, ist dies immer noch verwirrend, weil die Objekte unterschiedlich sind. Zum Beispiel kann ein Set<E> von verschiedenen Objekten E wird einige Objekte fallen lassen, wenn sie in eine TreeSet<E> auf der Grundlage der Comparator<E> verwendet. In beiden Fällen handelt es sich um eine Menge, aber die Menge der gespeicherten Elemente ist unterschiedlich. Meiner Meinung nach ist dies in den Dokumenten nicht gut geklärt.

Eine einfache Lösung: Wenn Sie den Comparator ändern können, darf er nicht 0 zurückgeben. Zum Beispiel anstelle von:

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

Verwendung:

public int compare(Integer o1, Integer o2) {
    return o1 < o2 ? -1: 1;
}

4voto

Alan Escreet Punkte 3399

Ein Hauptzweck einer Set soll no haben Duplikate. Sie wollen entweder keine Set oder Sie benötigen eine andere Comparator .

3voto

Andrey Adamovich Punkte 19669

Ein Zitat aus Javadoc für Set:

Eine Sammlung, die keine doppelten Elemente enthält

Verwenden Sie eine beliebige Ableitung von Liste .

2voto

Denis Lukenich Punkte 2994

Wenn Sie eine sortierte Liste wünschen, können Sie zum Beispiel eine Liste nehmen und Collections.sort() nach jedem Einfügen manuell aufrufen.

Oder Sie wickeln z.B. eine ArrayList ein, um die Sortieraufrufe für Sie zu übernehmen:

    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;
    }
}

Ich hoffe, ich habe alle Funktionen, die eine Sortierung erfordern können. (Entfernen ist nicht notwendig, um zu überschreiben)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X