57 Stimmen

Sortieren von Java-Objekten mit mehreren Schlüsseln

Ich habe eine Sammlung von Duck-Objekten und würde gerne sie nach mehreren Schlüsseln sortieren .

class Duck {
    DuckAge age; //implements Comparable
    DuckWeight weight; //implements Comparable
    String name;
}
List<Duck> ducks = Pond.getDucks();

z.B.. Ich möchte sie sortieren in erster Linie durch ihre Gewichte y in zweiter Linie durch ihr Alter . Wenn zwei Enten genau dasselbe Gewicht und genau dasselbe Alter haben, dann unterscheiden wir sie anhand ihrer Namen als Tertiärschlüssel . Ich könnte etwas in dieser Art machen:

Collections.sort(ducks, new Comparator<Duck>(){
    @Override
    public int compare(Duck d1, Duck d2){
        int weightCmp = d1.weight.compareTo(d2.weight);
        if (weightCmp != 0) {
            return weightCmp;
        }
        int ageCmp = d1.age.compareTo(d2.age);
        if (ageCmp != 0) {
            return ageCmp;
        }
        return d1.name.compareTo(d2.name);
    }
});

Ich mache das recht häufig, aber diese Lösung riecht nicht gut. Sie lässt sich nicht gut skalieren, und man kann es leicht vermasseln. Es muss doch einen besseren Weg geben, die Ducks mit mehreren Tasten zu sortieren! Kennt jemand eine bessere Lösung?

EDITAR Unnötiges entfernt else Zweige

4voto

Emmanuel Bourg Punkte 9272

Sie können verkettete BeanComparators von Commons BeanUtils:

Comparator comparator = new BeanComparator("weight", new BeanComparator("age"));

http://commons.apache.org/beanutils/v1.8.3/apidocs/org/apache/commons/beanutils/BeanComparator.html

4voto

AlexR Punkte 111534

Ich habe gerade Ihren Code ohne verschachtelte else-Anweisungen umgeschrieben. Gefällt er Ihnen jetzt?

@Override
public int compare(Duck d1, Duck d2){
    int weightCmp = d1.weight.compareTo(d2.weight);
    if (weightCmp != 0) {
        return weightCmp;
    }
    int ageCmp = d1.age.compareTo(d2.age);
    if (ageCmp != 0) {
        return ageCmp;
    } 

    return d1.name.compareTo(d2.age);
}

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