首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 字符串數組排序實現:基於 ASCII 碼的字典序比較算法

     編輯:Java 相關知識

問題背景

Java 中字符串無法直接用 > < 比較大小,編譯器報錯:The operator > is undefined for the argument type(s) java.lang.String, java.lang.String。需實現自定義比較邏輯。

字符串大小比較規則(字典序/ASCII 碼序)

  1. 逐字符比較 ASCII 碼值:'A'(65) < 'B'(66) < 'a'(97) < 'b'(98)
  2. 前綴相同時,長度長者視為大:"abc" > "ab"
  3. 空字符串 "" 最小

標準庫最佳實踐


// 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 比較邏輯有助於排查亂序問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved