2010-10-02 13 views

risposta

9

Tutti questi oggetti dovrebbe avere una comune classe astratta/interfaccia, come Alive con un metodo getLifeTime(), e si potrebbe avere sia Alive estende Comparable<Alive> o crea il tuo 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 
    } 
} 

O

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

Dopo che il prossimo passo è quello di utilizzare una collezione ordinato automaticamente (TreeSet<Alive>) oppure ordinare una List<Alive> con Collections.sort().


Risorse:

+0

Se si implementa 'Alive.compareTo', è necessario implementarlo correttamente, ovvero confrontare realmente le durate dei due oggetti invece di restituire 0. Altrimenti occorrerebbe un'implementazione (fondamentalmente duplicata) in ogni sottoclasse concreta. –

+1

@ Péter Török, non ho eseguito l'implementazione perché non conosco l'ordine desiderato. E non è necessario riscriverlo in ogni sottoclasse, questo è il motivo per cui ho usato una classe astratta nella prima parte e non un'interfaccia e anche perché ho lasciato questo lungo commento sulla riga 'return 0'. –

+0

Siamo spiacenti, il tuo commento sul codice non è chiaro su questo (almeno per me); è per questo che ho pensato fosse meglio aggiungere un commento chiarificatore :-) –

1

Il modo più semplice sarebbe coinvolgere i vostri corsi di tutti implementazione di un'interfaccia o di estensione di una classe base t hat espone l'attributo comune (lifeTime) utilizzato per il confronto. Altrimenti, potresti semplicemente creare un Comparator che utilizza la riflessione per ottenere l'attributo lifeTime e utilizzare tale valore nel metodo di confronto per il tuo comparatore. Ovviamente, questo genererà eccezioni se la tua collezione contiene mai un oggetto che non ha un attributo lifetime.

1

Se tutte le classi implementano una vita interfaccia definita come segue (sempre una buona idea in Java):

public interface Living { 
    int getLifeTime(); 
} 

è possibile ordinare le vostre collezioni di oggetti viventi utilizzando la libreria lambdaj come segue:

List<Alive> sortedLivings = sort(livings, on(Alive.class).getLifeTime()); 
+0

Sapevo che questo nome mi sembrava familiare. Questa domanda mi ha fatto pensare che per ora non esiste una soluzione per invertire l'ordine degli elementi in un dato iterabile (o per ordinare l'inverso dell'ordine naturale/comparatore) in lambdaj. –

Problemi correlati