2010-12-13 5 views
18

Ich habe eine Klasse, die ich schon nach einem Attribut sortiere. Jetzt muss ich noch etwas machen, dass ich eine andere Möglichkeit schaffen muss, meine Daten zu sortieren. Wie kann ich es machen, so kann ich zwischen den beiden Methoden wählen. Der einzige mir bekannte Befehl ist Collections.sort, der die Methode compareTo von der Klasse aufnimmt, mit der ich seine Daten vergleichen möchte.Wie mache ich 2 vergleichbare Methoden in nur einer Klasse?

Ist es überhaupt möglich?

+0

Wenn es möglich ist deutliche Worte anstelle von „Dinge“ zu verwenden und "Weg", dann wird es leichter, gute Antworten zu geben. So wie es aussieht, muss ich respektvoll zugeben, dass ich darum gekämpft habe, die genaue Frage zu verstehen. –

Antwort

49

Was Sie tun müssen, ist eine benutzerdefinierte Comparator zu implementieren. Und dann verwenden:

Collections.sort(yourList, new CustomComparator<YourClass>()); 

Insbesondere könnte man schreiben: (Dies wird eine anonyme Klasse erstellen, die Comparator implementiert.)

Collections.sort(yourList, new Comparator<YourClass>(){ 
    public int compare(YourClass one, YourClass two) { 
     // compare using whichever properties of ListType you need 
    } 
}); 

Sie könnten diese in Ihre Klasse bauen, wenn Sie mögen:

class YourClass { 

    static Comparator<YourClass> getAttribute1Comparator() { 
     return new Comparator<YourClass>() { 
      // compare using attribute 1 
     }; 
    } 

    static Comparator<YourClass> getAttribute2Comparator() { 
     return new Comparator<YourClass>() { 
      // compare using attribute 2 
     }; 
    } 
} 

Es könnte wie so verwendet werden:

Collections.sort(yourList, YourClass.getAttribute2Comparator()); 
3

Sie können nur eine compareTo() Methode in Ihrer Klasse haben.

Wenn Sie dieselbe Klasse auf mehrere Arten sortieren möchten, erstellen Sie Comparator Implementierungen.

3

Wenn die beiden Methoden den gleichen Footprint erfordern, können Sie eine einzelne Klasse mit mehreren Verwendungen unangemessen überladen, was durch das Korrigieren Ihrer Klassenhierarchie gelöst werden würde - statt "shape" unterlassen Sie sie mit "oval", "Rechteck" usw.

Wenn Unterklassen nicht sinnvoll sind, müssen Sie verschiedene Vergleichsklassen erstellen. In Java verwenden Sie häufig einen Vergleicher für Vergleiche. Erstellen Sie mehr (oder einen konfigurierbaren Komparator erstellen): IsbnComparator, AuthorComparator usw.

Oh, und die konfigurierbare Option wäre:

 
BookComparator implements Compartor { 
    enum FIELD { AUTHOR, ISBN, ... }; 
    setSortOrder(int rank, FIELD field){...} 
}