2011-04-08 29 views

Respuesta

16

Dada una clase de objeto que se ve así:

public class MyObject { 
    public String getString() { ... } 
    public Date getDate() { ... } 
    ... 
} 

escribir una clase comparador de encargo de este modo:

public class ObjectComparator implements Comparator{ 

    public int compare(Object obj1, Object obj2) { 
     MyObject myObj1 = (MyObject)obj1; 
     MyObject myObj2 = (MyObject)obj2; 
     stringResult = myObj1.getString().compareTo(myObj2.getString()); 
     if (stringResult == 0) { 
      // Strings are equal, sort by date 
      return myObj1.getDate().compareTo(myObj2.getDate()); 
     } 
     else { 
      return stringResult; 
     } 
    } 
} 

Entonces especie de la siguiente manera:

Collections.sort(objectList, new ObjectComparator()); 
+2

@Krt_Malta más claro uno? No lo creo. Por un lado, utiliza la versión pre-1.5 no genérica del comparador, que es mucho más prolijo y propenso a errores. La respuesta de I82Much es mucho mejor, por ejemplo. –

+0

De hecho, estoy de acuerdo en que debería haber hecho la versión genérica del comparador, y la cadena de comparación Guava suena como algo que vale la pena investigar si está contento de incorporar esa dependencia a su proyecto. (Presumiblemente tiene muchas otras cosas buenas también). – unnamedwill

+0

@unnamedwill por curiosidad, si acepta que es mejor usar el Comparador , ¿por qué no edita su respuesta? En este momento la respuesta de I82Much es la tercera en votos, por lo que algunas personas muy apresuradas podrían no leerla o estos comentarios y simplemente implementar su respuesta sin medicamentos genéricos. – Blueriver

6

La respuesta de los Comparadores es correcta pero incompleta.

GlazedLists tiene un buen método de utilidad para encadenar diferentes comparadores para evitar que escriba este texto estándar. Consulte el método chainComparators para obtener más información.

6

Implementar una costumbre Comparator, utilizando un método compare(a,b) como la siguiente:

de Java convencionales:

public int compare(YourObject o1, YourObject o2) { 
    int result = o1.getProperty1().compareTo(o2.getProperty1())); 
    if(result==0) result = o1.getProperty2().compareTo(o2.getProperty2()); 
    return result; 
} 

Con Guava (usando ComparisonChain):

public int compare(YourObject o1, YourObject o2) { 
    return ComparisonChain.start() 
     .compare(o1.getProperty1(), o2.getProperty1()) 
     .compare(o1.getProperty2(), o2.getProperty2()) 
     .result(); 
} 

Con Commons/Lang (usando CompareToBuilder):

public int compare(YourObject o1, YourObject o2) { 
    return new CompareToBuilder() 
     .append(o1.getProperty1(), o2.getProperty1()) 
     .append(o1.getProperty2(), o2.getProperty2()) 
     .toComparison(); 
} 

(Las tres versiones son equivalentes, pero la versión Java simple es la más prolija y, por lo tanto, más propensa a errores. Las tres soluciones asumen que tanto o1.getProperty1() como o1.getProperty2() implementan Comparable).

(Tomado de this previous answer of mine)


ahora lo hacen Collections.sort(yourList, yourComparator)

12

Con Java 8, esto es muy fácil.Dada

class MyClass { 
    String getString() { ... } 
    Date getDate() { ... } 
} 

Puede ordenar fácilmente una lista de la siguiente manera:

List<MyClass> list = ... 
list.sort(Comparator.comparing(MyClass::getString).thenComparing(MyClass::getDate)); 
+2

esta respuesta debería estar mucho más arriba – Joshua

+0

Esta es la respuesta más elegante y correcta. – ManoDestra

1

Utilización de Java 8 y técnica de clasificación paralela, también se puede lograr esto de la siguiente manera:

List<Employee> empss = getEmployees(); 
Comparator<Employee> combinedComparator = Comparator.comparing(Employee::getFName) 
                .thenComparing(Employee::getLName); 
Employee[] emppArr = employees.toArray(new Employee[empss.size()]); 

//Parallel sorting 
Arrays.parallelSort(emppArr, combinedComparator);