一、Collections類
? ? ?java.util.Collections 類是 Java 集合框架中的一個工具類,提供了一系列靜態方法來操作和處理各種類型的集合。這些方法簡化了對集合進行排序、查找、同步控制、創建只讀集合等常見操作的過程。
二、常用方法
方法類別? | ?方法簽名? | ?功能? | ?需求/約束? | ?算法/返回值? |
---|---|---|---|---|
?排序? | sort(List<T> list) | 對列表元素按自然順序升序排序 | 元素必須實現?Comparable ?接口 | 歸并排序或 TimSort |
sort(List<T> list, Comparator<? super T> c) | 按自定義比較器排序 | 需提供?Comparator ?對象 | 同上 | |
?查找? | binarySearch(List<? extends Comparable<? super T>> list, T key) | 二分查找元素 | 列表必須已按自然順序排序 | 找到返回索引;未找到返回?-(插入點) - 1 |
binarySearch(List<? extends T> list, T key, Comparator<? super T> c) | 使用自定義比較器二分查找 | 列表必須按比較器規則排序 | 同上 | |
?最大值/最小值? | max(Collection<? extends T> coll) | 返回集合中的最大元素 | 元素實現?Comparable ?接口 | - |
min(Collection<? extends T> coll) | 返回集合中的最小元素 | 同上 | - | |
max(Collection<? extends T> coll, Comparator<? super T> comp) | 使用比較器返回最大元素 | 需提供?Comparator | - | |
min(Collection<? extends T> coll, Comparator<? super T> comp) | 使用比較器返回最小元素 | 同上 | - | |
?反轉? | reverse(List<?> list) | 反轉列表元素順序 | - | - |
?隨機排序? | shuffle(List<?> list) | 隨機打亂列表順序 | - | 默認使用?Random ?類 |
shuffle(List<?> list, Random rnd) | 使用指定隨機源打亂順序 | 需提供?Random ?對象 | - | |
?填充? | fill(List<? super T> list, T obj) | 用指定對象填充列表所有元素 | 目標列表長度不變 | - |
?復制? | copy(List<? super T> dest, List<? extends T> src) | 將源列表元素復制到目標列表 | 目標列表長度 ≥ 源列表長度 | 直接覆蓋目標列表元素 |
?交換? | swap(List<?> list, int i, int j) | 交換列表中兩個索引位置的元素 | i ?和?j ?必須在列表有效范圍內 | - |
三、綜合應用
1、操作學生信息如下:
- 創建學生列表
- 添加學生
- 打印原始學生列表
- 對學生列表進行排序(按年齡升序)
- 查找年齡最大的學生
- 查找年齡最小的學生
- 反轉學生列表
- 替換年齡最小的學生的信息
- 填充學生列表
- 復制學生列表
- 交換兩個學生的位置
- 旋轉學生列表
- 隨機打亂學生列表
- 使用二分查找查找特定學生(按年齡排序后,但示例中查找的年齡與注釋不匹配)
2、編碼
? ?Student類
public class Student {private String id;private String name;private int age;public Student(String id, String name, int age) {this.id = id;this.name = name;this.age = age;}// Getters 和 Setterspublic String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{id='" + id + "', name='" + name + "', age=" + age + "}";}}
StudentManager類
public class StudentManager {public static void main(String[] args) {// 創建學生列表List<Student> students = new ArrayList<>();// 添加學生students.add(new Student("001", "Alice", 22));students.add(new Student("002", "Bob", 25));students.add(new Student("003", "Charlie", 23));students.add(new Student("004", "Diana", 21));// 打印原始學生列表System.out.println("原始數據:");for (Student student : students) {System.out.println(student);}// 對學生列表進行排序(按年齡升序)Collections.sort(students, Comparator.comparing(Student::getAge));System.out.println("\n按年齡升序:");for (Student student : students) {System.out.println(student);}// 查找年齡最大的學生Student oldestStudent = Collections.max(students, Comparator.comparing(Student::getAge));System.out.println("\n年齡最大的學生:");System.out.println(oldestStudent);// 查找年齡最小的學生Student youngestStudent = Collections.min(students, Comparator.comparing(Student::getAge));System.out.println("\n年齡最小的學生:");System.out.println(youngestStudent);// 反轉學生列表Collections.reverse(students);System.out.println("\n反轉:");for (Student student : students) {System.out.println(student);}// 替換年齡最小的學生的信息(例如,替換為另一個學生)Collections.replaceAll(students, youngestStudent, new Student("005", "Eve", 20));System.out.println("\n替換:");for (Student student : students) {System.out.println(student);}// 填充學生列表(用特定學生填充)Collections.fill(students, new Student("006", "Fiona", 24));System.out.println("\n填充:");for (Student student : students) {System.out.println(student);}// 復制學生列表List<Student> copiedStudents = new ArrayList<>(students);Collections.copy(copiedStudents, students);System.out.println("\n復制:");for (Student student : copiedStudents) {System.out.println(student);}// 交換兩個學生的位置,例如,將第一個和最后一個學生交換位置Collections.swap(students, 0, students.size() - 1);System.out.println("\n交換:");for (Student student : students) {System.out.println(student);}// 旋轉學生列表,例如,將列表向右旋轉2個位置Collections.rotate(students, 2);System.out.println("\n旋轉:");for (Student student : students) {System.out.println(student);}// 隨機打亂學生列表Collections.shuffle(students);System.out.println("\n隨機打亂:");for (Student student : students) {System.out.println(student);}// 使用二分查找查找特定學生(按年齡排序后)
// Student targetStudent = new Student("000", "Non-existent", 21); // 假設要查找年齡為21的學生Student targetStudent = new Student("000", "Non-existent", 27); // 假設要查找年齡為27的學生int index = Collections.binarySearch(students, targetStudent, Comparator.comparing(Student::getAge));if (index >= 0) {System.out.println("\n年齡是21的學生索引: " + index);System.out.println(students.get(index));} else {System.out.println("\n沒有找到年齡是21的學生索引: " + (-index - 1));}}
}
3、效果
?
四、總結
? ? ? Collections 類提供的方法大大簡化了對集合的操作,通過合理的選擇和使用這些方法,可以高效地實現各種集合處理邏輯。需要注意的是,某些方法(如排序和二分查找)對集合的狀態(如排序狀態)有要求,使用時需要確保滿足這些要求,以避免異常或錯誤的結果。
?