2010-10-02 25 views

Respuesta

9

Todos estos objetos deben tener una clase abstracta/interfaz común como Alive con un método getLifeTime(), y usted podría tener ya sea Alive extiende Comparable<Alive> o crea tu propio 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 
    } 
} 

Después de que el siguiente paso es utilizar una colección ordenada de forma automática (TreeSet<Alive>) u ordenar un List<Alive> con Collections.sort().


Recursos:

+0

Si implementa 'Alive.compareTo', debe implementarlo correctamente, es decir, realmente comparar las vidas de los dos objetos en lugar de devolver 0. De lo contrario, necesitaría una implementación (básicamente duplicada) en cada subclase concreta. –

+1

@ Péter Török, no he hecho la implementación porque no sé el orden deseado. Y realmente no tienes que volver a escribirlo en todas las subclases, esta es la razón por la que utilicé una clase abstracta en la primera parte y no una interfaz y también por qué dejé este largo comentario en la línea 'return 0'. –

+0

Lo sentimos, el comentario de su código no fue claro en esto (al menos para mí); por eso pensé que era mejor agregar un comentario aclaratorio :-) –

1

La forma más fácil involucrarían sus clases durante todo el implementar una interfaz o extender una clase base t sombrero expone el atributo común (tiempo de vida) utilizado para la comparación. De lo contrario, podría simplemente crear un Comparator que use reflexión para obtener el atributo de tiempo de vida y usar ese valor en el método de comparación para su comparador. Por supuesto, esto arrojará excepciones si su colección alguna vez contiene un objeto que no tenga atributo de tiempo de vida.

1

Si todas sus clases implementan una interfaz de estar definido como sigue (siempre es una buena idea en Java):

public interface Living { 
    int getLifeTime(); 
} 

puede ordenar sus colecciones de objetos de la vida mediante el uso de la biblioteca lambdaj como sigue:

+0

Sabía que este nombre me resultaba familiar. Esta pregunta me hizo pensar que por ahora no hay solución para invertir el orden de los elementos en un iterable dado (o para ordenar por el inverso del orden/comparador natural) en lambdaj. –

Cuestiones relacionadas