說我有兩個比較,一個主要和次要的。我如何首先由主比較器對數組進行排序,然後再對其進行排序?給出兩個比較器的排序數組?
說每個對象都有一個名稱和一個數字字段。
像
Bob 1
Bob 2
Jack 1
Jack 2
是否有可能,而無需創建一個新的比較?
說我有兩個比較,一個主要和次要的。我如何首先由主比較器對數組進行排序,然後再對其進行排序?給出兩個比較器的排序數組?
說每個對象都有一個名稱和一個數字字段。
像
Bob 1
Bob 2
Jack 1
Jack 2
是否有可能,而無需創建一個新的比較?
是的,你可以完成你的排序,而無需創建一個新的c omparator。
有一個well-known trick排序主要字段,第二,第三等:首先按最不重要的字段(第三),然後下一個重要字段(次要),最後是最重要的字段(主) 。但排序算法需要爲穩定爲此工作。
如果您正在對數組進行排序,請使用Arrays.sort()
。如果您正在對List
進行排序,請使用Collections.sort()
。這兩種方法都保證穩定。
假設您的主比較對象存儲在變量primaryComp
中,而您的輔助對象存儲在secondaryComp
中。然後這裏是一些代碼來實現你想要的:
Arrays.sort(mylist, secondaryComp); // This must come first!
Arrays.sort(mylist, primaryComp);
首先比較第二個比較器,然後比較第一個比較器。我相信應該這樣做。你可以創建一個類來這樣做。
class FullName {
public String firstName;
public String secondName;
}
說你創建一個新的名字,叫BobBobbins
,指定值,然後簡單先比較第二名稱,然後第一個名稱。你可以有一個靜態函數做比較:
public static bool compareTo (FullName name1, FullName name2) {
// Algorithm here
}
你應該使用一個靜態的比較,您可以將不得不這樣做:FullName.compareTo(BobBobbins, CharlieChaplin);
假設你的類是
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);
}});
不錯。我不知道那個訣竅! – Jack 2013-03-06 07:18:07