2013-03-06 22 views
7

說我有兩個比較,一個主要和次要的。我如何首先由主比較器對數組進行排序,然後再對其進行排序?給出兩個比較器的排序數組?

說每個對象都有一個名稱和一個數字字段。

Bob 1 
Bob 2 
Jack 1 
Jack 2 

是否有可能,而無需創建一個新的比較?

回答

7

是的,你可以完成你的排序,而無需創建一個新的c omparator。

有一個well-known trick排序主要字段,第二,第三等:首先按最不重要的字段(第三),然後下一個重要字段(次要),最後是最重要的字段(主) 。但排序算法需要爲穩定爲此工作。

如果您正在對數組進行排序,請使用Arrays.sort()。如果您正在對List進行排序,請使用Collections.sort()。這兩種方法都保證穩定。

假設您的主比較對象存儲在變量primaryComp中,而您的輔助對象存儲在secondaryComp中。然後這裏是一些代碼來實現你想要的:

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

不錯。我不知道那個訣竅! – Jack 2013-03-06 07:18:07

-1

首先比較第二個比較器,然後比較第一個比較器。我相信應該這樣做。你可以創建一個類來這樣做。

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

說你創建一個新的名字,叫BobBobbins,指定值,然後簡單先比較第二名稱,然後第一個名稱。你可以有一個靜態函數做比較:

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

你應該使用一個靜態的比較,您可以將不得不這樣做:FullName.compareTo(BobBobbins, CharlieChaplin);

6

假設你的類是

class X { 
    String name; 
    int num; 
} 

然後排序將是

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