Java 中字符串無法直接用 > < 比較大小,編譯器報錯:The operator > is undefined for the argument type(s) java.lang.String, java.lang.String。需實現自定義比較邏輯。
'A'(65) < 'B'(66) < 'a'(97) < 'b'(98)"abc" > "ab""" 最小
// 1. Arrays.sort() 自然排序(字典序升序)
String[] arr = {"fin", "abc", "shidema", "shide", "bushi"};
Arrays.sort(arr); // 修改原數組
// 結果:abc, bushi, fin, shide, shidema
// 2. Collections.sort() 配合 List
List list = Arrays.asList(arr);
Collections.sort(list);
// 3. 自定義 Comparator(降序、忽略大小寫等)
Arrays.sort(arr, Comparator.reverseOrder());
Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER);
public class StringArraySorter {
public static String[] sortAsc(String[] arr) {
if (arr == null) return null;
String[] copy = arr.clone(); // 不修改原數組
for (int i = 0; i < copy.length - 1; i++) {
for (int j = 0; j < copy.length - i - 1; j++) {
if (compareStr(copy[j], copy[j + 1]) > 0) {
// 交換
String tmp = copy[j];
copy[j] = copy[j + 1];
copy[j + 1] = tmp;
}
}
}
return copy;
}
/**
* 字符串比較:返回值同 String.compareTo()
* @return 負數: s1<s2, 0: 相等, 正數: s1>s2
*/
public static int compareStr(String s1, String s2) {
if (s1 == null || s2 == null) {
throw new IllegalArgumentException("字符串不能為 null");
}
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
int len = Math.min(c1.length, c2.length);
for (int i = 0; i < len; i++) {
if (c1[i] != c2[i]) {
return c1[i] - c2[i]; // ASCII 碼差值
}
}
// 前綴相同,比較長度
return c1.length - c2.length;
}
public static void main(String[] args) {
String[] data = {"fin", "abc", "shidema", "shide", "bushi"};
String[] sorted = sortAsc(data);
Arrays.stream(sorted).forEach(System.out::println);
}
}
abc
bushi
fin
shide
shidema
| 方案 | 時間複雜度 | 空間複雜度 | 適用場景 |
|---|---|---|---|
| 冒泡排序 | O(n²) | O(1) | 教學、極小數據量 |
| Arrays.sort() | O(n log n) | O(n) | 生產環境首選(Dual-Pivot QuickSort + TimSort) |
| Stream.sorted() | O(n log n) | O(n) | 函數式風格、鏈式操作 |
// 中文拼音排序
Collator cnCollator = Collator.getInstance(Locale.CHINA);
Arrays.sort(arr, cnCollator); // 按拼音字母序
// 自定義規則:數字優先、特殊字符後置
Arrays.sort(arr, (s1, s2) -> {
// 複雜業務邏輯
});
字符串排序核心在於 compareTo() / Comparator 契約。生產代碼直接使用 Arrays.sort() 或 Collections.sort(),僅在極特殊業務規則下實現自定義 Comparator。理解底層 ASCII 比較邏輯有助於排查亂序問題。