透過分析許多開源Java專案的原始程式碼,我發現大多數開發人員僅以兩種不同的方式實作排序。其中一種是基於使用類別
sort()
方法Collections
或Arrays
,另一種是基於使用自排序資料結構,例如TreeMap
和TreeSet
。
使用 sort() 方法
如果您需要對集合進行排序,請使用Collections.sort()
.
// Collections.sort(…)
List<ObjectName> list = new ArrayList<ObjectName>();
Collections.sort(list, new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
如果需要對數組進行排序,請使用Arrays.sort()
.
// Arrays.sort(…)
ObjectName[] arr = new ObjectName[10];
Arrays.sort(arr, new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
sort()
當集合或陣列已經充滿值時, 此方法非常方便。
使用自排序資料結構
如果需要對清單 (List
) 或集合 ( Set
) 進行排序,請使用TreeSet
排序結構。
// TreeSet
Set<ObjectName> sortedSet = new TreeSet<ObjectName>(new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
sortedSet.addAll(unsortedSet);
如果需要對字典進行排序 ( Map
),請使用TreeMap
排序結構。TreeMap
按鍵 ( key
) 排序。
// TreeMap – использующий String ключи и компаратор (Comparator) CASE_INSENSITIVE_ORDER,
// упорядочивающий строки (String) методом compareToIgnoreCase
Map<String, Integer> sortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
sortedMap.putAll(unsortedMap);
//TreeMap – общий случай, компаратор указывается вручную
Map<ObjectName, String> sortedMap = new TreeMap<ObjectName, String>(new Comparator<ObjectName>() {
public int compare(ObjectName o1, ObjectName o2) {
return o1.toString().compareTo(o2.toString());
}
});
sortedMap.putAll(unsortedMap);
當您需要對集合中的元素執行大量搜尋時,上述方法非常有用。自排序資料結構的效率O(log(n))
優於O(n)
. 這意味著當集合中的資料量增加一倍時,搜尋時間不會增加一倍,而是以恆定量 增加。
排序問題的錯誤方法
您仍然可以找到程式設計師獨立描述排序演算法的範例。考慮下面給出的排序代碼(按升序對雙精度數組進行排序)。這段程式碼不僅效率低下,而且不可讀。這樣的例子還有很多。double t;
for (int i = 0; i < N; i++)
for (int j = i + 1; j < N; j++)
if (r[j] < r[i]) {
t = r[i];
r[i] = r[j];
r[j] = t;
}
GO TO FULL VERSION