Java Collections Framework 中的 List 實現(Vector、ArrayList、LinkedList)提供索引訪問與增刪操作,但內建不支援排序。排序需借助 java.util.Collections.sort() 靜態方法。
若 List 元素為同一類型且實現 Comparable 接口,可直接調用:
List list = ...;
Collections.sort(list);
若類別未實現 Comparable、或需非默認順序,可傳入 Comparator:
Collections.sort(list, comparator);
不同類型元素混合排序需編寫跨類 Comparator。
使用 Collections.reverseOrder() 獲取反序 Comparator:
List list = ...;
Comparator comp = Collections.reverseOrder();
Collections.sort(list, comp);
範例:[Man, man, Woman, woman] 反序後為 [man, woman, Man, Woman](按 Unicode 值降序)。
Collections.sort() 為原地排序,會改變原 List。需保留原序時先複製:
List copyOfList = new ArrayList(list);
Collections.sort(copyOfList);
兩種方式:
String.CASE_INSENSITIVE_ORDER(推薦)// 方式二:一行搞定
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
注意:排序算法為穩定排序,相同元素(如 "woman" 與 "Woman")相對順序保持不變。
java.text.Collator 與 CollationKey 支援語言敏感排序:
public static class CollatorComparator implements Comparator {
Collator collator = Collator.getInstance(); // 或傳入 Locale
public int compare(Object o1, Object o2) {
CollationKey k1 = collator.getCollationKey(o1.toString());
CollationKey k2 = collator.getCollationKey(o2.toString());
return k1.compareTo(k2);
}
}
優勢:固定的不區分大小寫 + 跨語言正確排序。例如西班牙語 mañana 正確排在 mantra 之前(非 Collator 會排在後)。
若文本非默認語言,需傳入 Locale:Collator.getInstance(myLocale)。
import java.awt.BorderLayout;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
public class SortIt {
public static class CollatorComparator implements Comparator {
Collator collator = Collator.getInstance();
public int compare(Object o1, Object o2) {
return collator.getCollationKey(o1.toString())
.compareTo(collator.getCollationKey(o2.toString()));
}
}
public static class CaseInsensitiveComparator implements Comparator {
public int compare(Object o1, Object o2) {
return o1.toString().toLowerCase().compareTo(o2.toString().toLowerCase());
}
}
public static void main(String args[]) {
String words[] = {"man", "Man", "Woman", "woman",
"Manana", "manana", "mañana", "Mañana",
"Mantra", "mantra", "mantel", "Mantel"};
JFrame frame = new JFrame("Sorting Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea textArea = new JTextArea();
frame.getContentPane().add(new JScrollPane(textArea), BorderLayout.CENTER);
StringWriter buffer = new StringWriter();
PrintWriter out = new PrintWriter(buffer);
// 原始列表
List list = new ArrayList(Arrays.asList(words));
out.println("Original list:"); out.println(list); out.println();
// 默認排序
Collections.sort(list);
out.println("Default sorting:"); out.println(list); out.println();
// 不區分大小寫
list = new ArrayList(Arrays.asList(words));
Collections.sort(list, new CaseInsensitiveComparator());
out.println("Case insensitive:"); out.println(list); out.println();
// 本地化排序
list = new ArrayList(Arrays.asList(words));
Collections.sort(list, new CollatorComparator());
out.println("Collator sorting:"); out.println(list); out.println();
textArea.setText(buffer.toString());
frame.pack();
frame.setVisible(true);
}
}
Collections.sort() 為原地排序,需保留原序請先複製String.CASE_INSENSITIVE_ORDERCollator/CollationKey