Java 集合框架的 ArrayList 本身不保證順序,但透過 Collections.sort() 搭配 Comparator 介面,即可實現靈活的自訂排序邏輯。本文以學生物件為例,示範如何依年齡與姓名進行排序。
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// Getter / Setter 省略
public String getName() { return name; }
public int getAge() { return age; }
@Override public String toString() { return name + " / " + age; }
}
class SortByAge implements Comparator {
@Override
public int compare(Student s1, Student s2) {
return Integer.compare(s1.getAge(), s2.getAge()); // 升冪
}
}
class SortByName implements Comparator {
@Override
public int compare(Student s1, Student s2) {
return s1.getName().compareTo(s2.getName()); // 字典序
}
}
public class ArrayListSortDemo {
public static void main(String[] args) {
List students = new ArrayList<>();
students.add(new Student("丁曉宇", 21));
students.add(new Student("趙四", 22));
students.add(new Student("張三", 11));
students.add(new Student("劉武", 19));
System.out.println("=== 依年齡排序 (升冪) ===");
Collections.sort(students, new SortByAge());
students.forEach(System.out::println);
System.out.println("\n=== 依姓名排序 (字典序) ===");
Collections.sort(students, new SortByName());
students.forEach(System.out::println);
}
}
無需額外建立類別,直接使用 Lambda 表達式:
// 依年齡排序
students.sort(Comparator.comparingInt(Student::getAge));
// 依姓名排序
students.sort(Comparator.comparing(Student::getName));
// 多重排序:先年齡再姓名
students.sort(Comparator.comparingInt(Student::getAge)
.thenComparing(Student::getName));
Collections.sort(list, comparator) 會**修改原列表** (in-place)。Comparator 回傳負值、零、正值分別代表「小於、等於、大於」。Comparator.comparing() 等靜態工廠方法,大幅減少樣板代碼。Comparable,可直接呼叫 Collections.sort(list) 使用自然排序。