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

Java 集合排序技巧:List 排序完全指南

     編輯:Java 程式設計入門

List 排序基礎

Java Collections Framework 中的 List 實現(Vector、ArrayList、LinkedList)提供索引訪問與增刪操作,但內建不支援排序。排序需借助 java.util.Collections.sort() 靜態方法。

基本排序

若 List 元素為同一類型且實現 Comparable 接口,可直接調用:

List list = ...;
Collections.sort(list);

自定義排序:Comparator

若類別未實現 Comparable、或需非默認順序,可傳入 Comparator:

Collections.sort(list, comparator);

不同類型元素混合排序需編寫跨類 Comparator。

常見排序場景與解決方案

1. 反序排序

使用 Collections.reverseOrder() 獲取反序 Comparator:

List list = ...;
Comparator comp = Collections.reverseOrder();
Collections.sort(list, comp);

範例:[Man, man, Woman, woman] 反序後為 [man, woman, Man, Woman](按 Unicode 值降序)。

2. 保留原始順序:副本排序

Collections.sort() 為原地排序,會改變原 List。需保留原序時先複製:

List copyOfList = new ArrayList(list);
Collections.sort(copyOfList);

3. 不區分大小寫排序

兩種方式:

  • 自定義 Comparator:轉小寫後比較
  • 使用內建常量:String.CASE_INSENSITIVE_ORDER(推薦)
// 方式二:一行搞定
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

注意:排序算法為穩定排序,相同元素(如 "woman" 與 "Woman")相對順序保持不變。

4. 多語言/本地化排序:Collator

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() 為原地排序,需保留原序請先複製
  • 字符串默認按 Unicode 值排序(大寫字母先於小寫)
  • 不區分大小寫首選 String.CASE_INSENSITIVE_ORDER
  • 多語言環境必須使用 Collator/CollationKey
  • 排序算法穩定,相等元素相對位置不變

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