2015-08-26 7 views
7

Ich habe eine Liste von Objekten, die ich mit anderen Eigenschaften sortieren möchte.Ich möchte Collections.sort() zweimal für zwei verschiedene Parameter verwenden

@Override 
public int compareTo(Object obj) 
{ 
    Field tab = (Field) obj; 

    int objx = Integer.parseInt(tab.getX()); 
    // int objy = Integer.parseInt(tab.getY()); 

    int classX = Integer.parseInt(this.X); 

    if (classX == objx) 
     return 0; 
    else if (classX > objx) 
     return 1; 
    else 
     return -1; 
} 

Was ich habe, so weit:

Collections.sort(list1); // But using property1 to sort 
Collections.sort(list1); // But using property2 to sort 

also in ersten Fall ich in der Lage bin mit property1 zu sortieren, aber wie mit property2 zu sortieren? Ich versuche, mit anderen Parametern zu sortieren, aber compareTo() akzeptiert nur einen.

Antwort

5

Wenn Sie zwei unterschiedliche Eigenschaft verwenden möchten, müssen Sie zwei verschiedene Komparatoren verwenden.

Ein Komparator ist eine Klasse, die die Schnittstelle Comparator

public class EmpSort { 
    static final Comparator<Employee> comp1 = new Comparator<Employee>() { 
     public int compare(Employee e1, Employee e2) { 
      // use prperty1 to sort 
      return e2.hireDate().compareTo(e1.hireDate()); 
     } 
    }; 
} 
public class EmpSort2 { 
    static final Comparator<Employee> comp2 = new Comparator<Employee>() { 
     public int compare(Employee e1, Employee e2) { 
      // use prperty2 to sort 
      return e2.hireDate().compareTo(e1.hireDate()); 
     } 
    }; 
} 

Collections.sort(list1, comp1);//but using prperty1 to sort 
Collections.sort(list1, comp2);//but using prperty2 to sort 

Eine weitere Frage Collections sort(List<T>,Comparator<? super T>) method example

+0

Sie meinen zu sagen, ich muss eine andere Klasse machen, die zwei verschiedene Komparatoren enthält – SOP

+0

Sie können anonyme Klasse verwenden, wenn Sie möchten. – Rodolfo

6

erstellen Sie können zwei verschiedene Komparatoren eine für jede Eigenschaft und übergeben das zu

Collections.sort(list1, comparator1); 
Collections.sort(list1, comparator2); 
+0

Wie oben ich die Methode compaerto (Object ob) – SOP

+1

Sie überschreiben bin gezeigt müssen zwei getrennte Vergleicher schreiben und jedes compareTo() -Methode außer Kraft setzen und sie dann entlang passieren. Momentan hast du nur einen geschrieben. Sie müssen eine andere für andere Eigenschaft schreiben. –

6
Collections.sort(list1, new Comparator<T>() { 
     public int compare(T arg0, T arg1) { 
      //your compare logic for prperty1 
     } 
    }); 
    Collections.sort(list1, new Comparator<T>() { 
     public int compare(T arg0, T arg1) { 
      //your compare logic for prperty2 
     } 
    }); 
2

Java 8 stellt einige nützliche Funktionen in den Vergleicher-Schnittstelle implementiert.

Collections.sort(list, Comparator.comparingInt(Field::getX)); 
Collections.sort(list, Comparator.comparingInt(Field::getY)); 

Wenn Sie die Komparatoren verschachteln möchten, gibt es wieder nette Funktionen.

Collections.sort(list, Comparator.comparingInt(Field::getX).thenComparingInt(Field::getY));