Komparator-und equals()

Nehme an, ich brauche TreeSet mit Elementen sortiert mit einigen Domänen-Logik. Durch diese Logik ist es egal, um einige Elemente, die nicht gleich so vergleichen, können Sie die Methode 0 zurück, aber in diesem Fall konnte ich nicht setzen Sie Sie in TreeSet.

So, Frage: welche Nachteile werde ich haben aus code wie folgt:

class Foo implements Comparable<Foo>{}
new TreeSet<Foo>(new Comparator<Foo>(){
    @Override
    public int compare(Foo o1, Foo o2) {
        int res = o1.compareTo(o2);
        if(res == 0 || !o1.equals(o2)){
            return o1.hashCode() - o2.hashCode();
        }
        return res;
    }
});

Update:

Ok. Wenn sollte es immer sein, eine Konsistenz zwischen den Methoden equals(), hashcode() und compareTo(), wie @S. P. Floyd - seanizer und andere sagten.
Wäre es besser oder sogar gut, wenn werde ich entfernen Comparable - Schnittstelle und verschieben Sie diese Logik in Comparator (ich kann es tun, ohne gebrochen Kapselung)? So wird es sein:

class Foo{}
new TreeSet<Foo>(new Comparator<Foo>(){
    @Override
    public int compare(Foo o1, Foo o2) {
        //some logic start
        if(strictliBigger(o1, o2)){ return 1;}
        if(strictliBigger(o2, o1)){ return -1;}
        //some logic end
        if(res == 0 || !o1.equals(o2)){
            return o1.hashCode() - o2.hashCode();
        }
        return res;
    }
});

Update 2:

Würde System.identityHashCode(x) besser sein, als hashCode() wenn ich Sie nicht brauche stabile Sortieren?

Also, Sie wollen, schreiben Sie Ihre eigenen Komparator, um die Struktur der Bestellung in Ihrem treeset?
Elite Gentleman, ja.
einer dieser kehrt nach strictliBigger sollte -1 sein
seanizer, Danke. Behoben.

InformationsquelleAutor Stan Kurilin | 2010-12-03

Schreibe einen Kommentar