2010-10-02 14 views

Antwort

9

Alle diese Objekte sollten eine gemeinsame abstrakte Klasse/Schnittstelle haben wie Alive mit einem Verfahren getLifeTime(), und man konnte entweder Alive erstreckt Comparable<Alive> oder Erstelle deine eigene Comparator<Alive>.

public abstract class Alive extends Comparable<Alive>{ 
    public abstract int getLifeTime(); 
    public int compareTo(Alive alive){ 
     return 0; // Or a negative number or a positive one based on the getLifeTime() method 
    } 
} 

Oder

public interface Alive { 
    int getLifeTime(); 
} 

public class AliveComparator implements Comparator<Alive>{ 
    public int compare(Alive alive1, Alive alive2){ 
     return 0; // Or a negative number or a positive one based on the getLifeTime() method 
    } 
} 

Danach ist der nächste Schritt entweder eine automatisch sortierte Sammlung zu verwenden ist (TreeSet<Alive>) oder ein mit List<Alive>Collections.sort() sortieren.


Ressourcen:

+0

Wenn Sie 'Alive.compareTo' implementieren, sollten Sie es richtig implementieren, dh vergleichen Sie die Lebensdauern der beiden Objekte, anstatt 0 zurückzugeben. Andernfalls würden Sie in jeder konkreten Unterklasse eine (im Grunde doppelte) Implementierung benötigen. –

+1

@ Péter Török, ich habe die Implementierung nicht gemacht, weil ich die gewünschte Bestellung nicht kenne. Und Sie müssen es wirklich nicht in jeder Unterklasse neu schreiben, das ist der Grund, warum ich eine abstrakte Klasse im ersten Teil und nicht eine Schnittstelle verwendet habe und auch, warum ich diesen langen Kommentar auf der Zeile "return 0" gelassen habe. –

+0

Entschuldigung, Ihr Code-Kommentar war nicht klar (zumindest für mich); deshalb dachte ich, es wäre besser, einen klärenden Kommentar hinzuzufügen :-) –

1

Der einfachste Weg wäre Ihre Klassen beinhalten alle eine Schnittstelle implementieren oder eine Basisklasse t Verlängerung hat das gemeinsame Attribut (lifeTime) für den Vergleich verfügbar gemacht. Andernfalls können Sie einfach eine Comparator erstellen, die Reflektion verwendet, um das Attribut lifeTime abzurufen und diesen Wert in der Vergleichsmethode für Ihren Vergleicher zu verwenden. Natürlich werden dadurch Ausnahmen ausgelöst, wenn Ihre Sammlung jemals ein Objekt enthält, das kein lifeTime-Attribut besitzt.

1

Wenn alle Klassen einen Wohn Schnittstelle implementieren definiert, wie es (immer eine gute Idee, in Java) folgt:

public interface Living { 
    int getLifeTime(); 
} 

Sie Ihre Sammlungen von lebenden Objekten mithilfe der lambdaj Bibliothek sortieren können wie folgt:

+0

Ich wusste, dass dieser Name mir bekannt vorkam. Diese Frage ließ mich denken, dass es im Moment keine Lösung gibt, um die Elementordnung in einem gegebenen iterablen Element (oder nach der Umkehrung der natürlichen Ordnung/Komparator) in Lambdaj zu invertieren. –

Verwandte Themen