2013-03-06 18 views
7

Powiedzmy, że mam dwa komparatory: podstawowy i wtórny. W jaki sposób mogę najpierw uporządkować tablicę według pierwotnego komparatora, a następnie za pomocą drugorzędnego?Sortowanie macierzy z dwoma komparatorami?

Powiedz, że każdy obiekt ma nazwę i pole liczbowe.

Jak

Bob 1 
Bob 2 
Jack 1 
Jack 2 

Czy to możliwe, bez tworzenia nowego komparator?

Odpowiedz

7

Tak, możesz dokonać sortowania bez tworzenia nowego c omparator.

Istnieje do sortowania według pola podstawowego, drugorzędnego, trzeciorzędowego, itd .: Najpierw sortuj według najmniej ważnego pola (trzeciorzędne), następnie następne ważne pole (drugorzędne), a na końcu najważniejsze pole (pierwotne) . Ale algorytm sortowania musi być stabilny, aby to działało.

Jeśli sortujesz tablicę, użyj Arrays.sort(). Jeśli sortujesz plik List, użyj Collections.sort(). Obie te metody gwarantują stabilność.

Załóżmy, że podstawowy obiekt porównawczy jest przechowywany w zmiennej primaryComp, a drugorzędny jest w secondaryComp. Oto kod, który pozwala osiągnąć to, czego potrzebujesz:

Arrays.sort(mylist, secondaryComp); // This must come first! 
Arrays.sort(mylist, primaryComp); 
+0

Nice. Nie wiedziałem o tej sztuczce! – Jack

-1

Najpierw porównaj drugi komparator, a następnie pierwszy komparator. Uważam, że powinno to załatwić sprawę. Możesz stworzyć klasę, aby to zrobić.

class FullName { 
    public String firstName; 
    public String secondName; 
} 

Say utworzyć nową nazwę, zwany BobBobbins, a następnie przypisać wartości proste porównanie drugie imię, a potem imię. Można mieć statyczną funkcję zrobić to porównanie:

public static bool compareTo (FullName name1, FullName name2) { 
    // Algorithm here 
} 

należy użyć statycznego porównawczy, można będzie musiał to zrobić: FullName.compareTo(BobBobbins, CharlieChaplin);

6

zakładając, że klasa jest

class X { 
    String name; 
    int num; 
} 

następnie sortowanie będzie

Arrays.sort(x, new Comparator<X>() { 
     @Override 
     public int compare(X o1, X o2) { 
      if (o1.name.equals(o2.name)) { 
       return Integer.compare(o1.num, o2.num); 
      } 
      return o1.name.compareTo(o2.name); 
     }}); 
Powiązane problemy