JavaRush /Java Blog /Random-TW /如何在Java中正確排序
eGarmin
等級 41

如何在Java中正確排序

在 Random-TW 群組發布
透過分析許多開源Java專案的原始程式碼,我發現大多數開發人員僅以兩種不同的方式實作排序。其中一種是基於使用類別sort()方法CollectionsArrays,另一種是基於使用自排序資料結構,例如TreeMapTreeSet如何在Java中正確排序 - 1

使用 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;
		}
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION