|
|
@@ -1,4 +1,4 @@
|
|
|
-# 20260803 课堂笔记 — 比较器排序(Comparable 自然排序 / Comparator 比较器排序)+ 20260731 课后作业解析
|
|
|
+# 20260803 课堂笔记 — 比较器排序(Comparable 自然排序 / Comparator 比较器排序)+ 集合工具类 Collections + 20260731 课后作业解析
|
|
|
|
|
|
- **日期**:2026-08-03
|
|
|
- **项目**:`c260803`
|
|
|
@@ -13,11 +13,12 @@
|
|
|
2. [自然排序 Comparable(实体类内建排序规则)](#2-自然排序-comparable实体类内建排序规则)
|
|
|
3. [比较器排序 Comparator(临时自定义排序)](#3-比较器排序-comparator临时自定义排序)
|
|
|
4. [返回值规则与 compareTo/equals 一致性的官方推荐](#4-返回值规则与-comparetoequals-一致性的官方推荐)
|
|
|
-5. [20260731 课后作业解析:Map 集合基本操作与遍历](#5-20260731-课后作业解析map-集合基本操作与遍历)
|
|
|
-6. [20260731 课后作业解析:异常处理综合(自定义异常)](#6-20260731-课后作业解析异常处理综合自定义异常)
|
|
|
-7. [20260731 课后作业解析:匿名内部类 Comparator 排序](#7-20260731-课后作业解析匿名内部类-comparator-排序)
|
|
|
-8. [随堂练习要点](#8-随堂练习要点)
|
|
|
-9. [拓展阅读](#9-拓展阅读)
|
|
|
+5. [集合工具类 Collections](#5-集合工具类-collections)
|
|
|
+6. [20260731 课后作业解析:Map 集合基本操作与遍历](#6-20260731-课后作业解析map-集合基本操作与遍历)
|
|
|
+7. [20260731 课后作业解析:异常处理综合(自定义异常)](#7-20260731-课后作业解析异常处理综合自定义异常)
|
|
|
+8. [20260731 课后作业解析:匿名内部类 Comparator 排序](#8-20260731-课后作业解析匿名内部类-comparator-排序)
|
|
|
+9. [随堂练习要点](#9-随堂练习要点)
|
|
|
+10. [拓展阅读](#10-拓展阅读)
|
|
|
|
|
|
---
|
|
|
|
|
|
@@ -189,7 +190,108 @@ for (Student s : treeSet) {
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 5. 20260731 课后作业解析:Map 集合基本操作与遍历
|
|
|
+## 5. 集合工具类 Collections
|
|
|
+
|
|
|
+### 概念
|
|
|
+
|
|
|
+`java.util.Collections` 是**操作集合的工具类**,专门用来对 `List` / `Set` / `Map` 等集合进行排序、查找、填充、转换等操作。
|
|
|
+
|
|
|
+- 工具类里的方法**全部是静态方法**,**不需要创建对象**,直接通过类名调用
|
|
|
+- 类比记忆:`Arrays` 是**数组**的工具类,`Collections` 就是**集合**的工具类
|
|
|
+- 今天重点:`Collections.sort` 是**比较器排序**在 List 上的应用——传入 `Comparator` 匿名内部类即可对 List 自定义排序(与 TreeSet 构造传 Comparator 思路一致)
|
|
|
+
|
|
|
+### 快速创建集合:List.of()
|
|
|
+
|
|
|
+```java
|
|
|
+// 来源:course/Demo02.java(部分)
|
|
|
+// List.of() 是 JDK9+ 提供的快速创建【不可变集合】的方法
|
|
|
+// 再用 new ArrayList<>(...) 包装成可变的 ArrayList
|
|
|
+List<String> list = new ArrayList<>(List.of("C", "B", "A", "F", "G"));
|
|
|
+```
|
|
|
+
|
|
|
+### 代码示例(Collections 常用方法)
|
|
|
+
|
|
|
+```java
|
|
|
+// 来源:course/Demo02.java
|
|
|
+package course;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+public class Demo02 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ List<String> list = new ArrayList<>(List.of("C", "B", "A", "F", "G"));
|
|
|
+
|
|
|
+ // 1. 排序:自然顺序升序——要求每个元素都必须实现 Comparable 接口,重写 compareTo()
|
|
|
+ Collections.sort(list);
|
|
|
+
|
|
|
+ // 2. 排序:自定义方式排序——Comparator 匿名内部类,重写 compare()
|
|
|
+ Collections.sort(list, new Comparator<String>() {
|
|
|
+ @Override
|
|
|
+ public int compare(String o1, String o2) {
|
|
|
+ return o1.compareTo(o2);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 3. 逆序:把集合元素顺序反转
|
|
|
+ Collections.reverse(list);
|
|
|
+
|
|
|
+ // 4. 查找:二分查找指定元素,存在返回索引,不存在返回 -1
|
|
|
+ int i = Collections.binarySearch(list, "C");
|
|
|
+
|
|
|
+ // 5. 查找最大 / 最小元素
|
|
|
+ String max = Collections.max(list);
|
|
|
+ String min = Collections.min(list);
|
|
|
+
|
|
|
+ // 6. 把当前集合转化为不可变集合(不能 add / remove)
|
|
|
+ List<String> unmodifiableList = Collections.unmodifiableList(list);
|
|
|
+
|
|
|
+ // 7. 随机打乱集合元素顺序
|
|
|
+ Collections.shuffle(list);
|
|
|
+
|
|
|
+ // 8. 使用某个对象全部填充元素
|
|
|
+ Collections.fill(list, "X");
|
|
|
+
|
|
|
+ // 9. 交换两个位置的元素
|
|
|
+ Collections.swap(list, 0, 1);
|
|
|
+
|
|
|
+ // 10. 旋转元素:整体向后移动 distance 个位置
|
|
|
+ Collections.rotate(list, 2);
|
|
|
+
|
|
|
+ // 11. 替换指定元素:把旧值全部换成新值
|
|
|
+ Collections.replaceAll(list, "A", "Z");
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Collections 常用方法速查
|
|
|
+
|
|
|
+| 方法 | 作用 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| `sort(List)` | 自然升序排序 | 元素**必须实现 Comparable**,否则抛 ClassCastException |
|
|
|
+| `sort(List, Comparator)` | 自定义排序 | 与 TreeSet(Comparator) 思路一致,按 compare 返回值排 |
|
|
|
+| `reverse(List)` | 逆序 | 把集合元素顺序整体反转 |
|
|
|
+| `binarySearch(List, key)` | 二分查找 | 返回元素索引,不存在返回 -1;**查找前必须先排序** |
|
|
|
+| `max(List)` / `min(List)` | 最大 / 最小元素 | 元素须可比较(实现 Comparable) |
|
|
|
+| `unmodifiableList(List)` | 转不可变集合 | 返回的集合不能增删改,否则抛 UnsupportedOperationException |
|
|
|
+| `shuffle(List)` | 随机打乱 | 类似洗牌 |
|
|
|
+| `fill(List, obj)` | 全部填充 | 用指定对象替换集合中所有元素 |
|
|
|
+| `swap(List, i, j)` | 交换元素 | 交换两个索引位置的元素 |
|
|
|
+| `rotate(List, distance)` | 旋转元素 | 元素整体向后移动 distance 个位置 |
|
|
|
+| `replaceAll(List, oldVal, newVal)` | 替换元素 | 把所有 oldVal 替换为 newVal |
|
|
|
+
|
|
|
+### 关键理解
|
|
|
+
|
|
|
+1. **Collections 与比较器的关系**:`Collections.sort(list, comparator)` 把**比较器排序**从「集合存入时」扩展到了「已有 List 排序」——二者共用同一套返回值规则(负数存左 / 0 相等 / 正数存右)。
|
|
|
+2. **`sort(List)` 的前提**:自然排序要求元素实现 `Comparable`,否则运行时报 `ClassCastException`——与 TreeSet/TreeMap 存入对象的要求**完全一致**。
|
|
|
+3. **`binarySearch` 使用前提**:二分查找基于有序数组,所以**查找前必须先 sort**,否则结果不可靠;找不到返回 -1。
|
|
|
+4. **`List.of()` 的陷阱**:返回的是**不可变集合**,直接 `add`/`remove` 会抛 `UnsupportedOperationException`;Demo02 用 `new ArrayList<>(List.of(...))` 包装后才可变。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 20260731 课后作业解析:Map 集合基本操作与遍历
|
|
|
|
|
|
### 作业要求回顾
|
|
|
|
|
|
@@ -262,7 +364,7 @@ public class MapDemo {
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 6. 20260731 课后作业解析:异常处理综合(自定义异常)
|
|
|
+## 7. 20260731 课后作业解析:异常处理综合(自定义异常)
|
|
|
|
|
|
### 作业要求回顾
|
|
|
|
|
|
@@ -337,7 +439,7 @@ public class ScoreStatisticsDemo {
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 7. 20260731 课后作业解析:匿名内部类 Comparator 排序
|
|
|
+## 8. 20260731 课后作业解析:匿名内部类 Comparator 排序
|
|
|
|
|
|
### 作业要求回顾
|
|
|
|
|
|
@@ -419,7 +521,7 @@ public class Student {
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 8. 随堂练习要点
|
|
|
+## 9. 随堂练习要点
|
|
|
|
|
|
### 练习一:自然排序(Comparable)与比较器排序(Comparator)对比
|
|
|
|
|
|
@@ -466,9 +568,25 @@ public class Student {
|
|
|
1. double 成绩比较为什么不用 `(int)(s1.getScore()-s2.getScore())`?—— double 相减可能有精度误差,强转 int 也不安全;`Double.compare` 是标准做法
|
|
|
2. 降序为什么交换参数位置即可?—— compare 返回值符号取反,排序方向随之反转
|
|
|
|
|
|
+### 练习五:Collections 工具类常用方法
|
|
|
+
|
|
|
+**核心步骤**:
|
|
|
+1. 用 `new ArrayList<>(List.of("C","B","A","F","G"))` 快速创建可变 List
|
|
|
+2. `Collections.sort(list)` 自然排序 → 观察字母升序
|
|
|
+3. `Collections.sort(list, new Comparator<String>(){...})` 自定义排序(如降序)
|
|
|
+4. `Collections.reverse(list)` / `Collections.shuffle(list)` 观察顺序变化
|
|
|
+5. `Collections.binarySearch(list, "C")`(先排序再查找)、`Collections.max/min(list)`
|
|
|
+6. `Collections.unmodifiableList(list)` 转不可变集合后尝试 `add()`,观察异常
|
|
|
+7. `Collections.fill(list, "X")` / `Collections.swap(list, 0, 1)` / `Collections.replaceAll(list, "A", "Z")`
|
|
|
+
|
|
|
+**思考**:
|
|
|
+1. `Collections.sort(list)` 为什么要求元素实现 `Comparable`?不实现会怎样?—— 工具类内部要比较元素大小,不实现则运行时抛 `ClassCastException`
|
|
|
+2. `binarySearch` 查找前为什么要先排序?—— 二分查找基于有序序列,未排序结果不可靠
|
|
|
+3. `List.of()` 返回的集合为什么不能 `add/remove`?—— 返回的是不可变集合,直接修改抛 `UnsupportedOperationException`,需用 `new ArrayList<>(...)` 包装
|
|
|
+
|
|
|
---
|
|
|
|
|
|
-## 9. 拓展阅读
|
|
|
+## 10. 拓展阅读
|
|
|
|
|
|
### 官方文档
|
|
|
|
|
|
@@ -476,7 +594,8 @@ public class Student {
|
|
|
- [Comparator 接口 (JDK 17)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Comparator.html)
|
|
|
- [TreeSet (JDK 17)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/TreeSet.html)
|
|
|
- [TreeMap (JDK 17)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/TreeMap.html)
|
|
|
-- [Collections.sort() (JDK 17)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Collections.html#sort(java.util.List,java.util.Comparator))
|
|
|
+- [Collections 工具类 (JDK 17)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Collections.html)
|
|
|
+- [List.of() (JDK 17)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html#of())
|
|
|
- [RuntimeException (JDK 17)](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/RuntimeException.html)
|
|
|
|
|
|
### 推荐阅读
|
|
|
@@ -493,3 +612,5 @@ public class Student {
|
|
|
| 集合体系与泛型(0729) | TreeSet / TreeMap 有序集合 | 红黑树底层(0731 已讲) |
|
|
|
| HashMap 基本操作(0731) | Map 综合练习(keySet/entrySet 遍历) | Map 与 Set 的互转、分组统计 |
|
|
|
| 异常处理(0728) | 自定义异常 + 多 catch 块 | 异常链、try-with-resources |
|
|
|
+| Arrays 工具类(0716) | Collections 集合工具类 | Stream API、Java 8 新特性 |
|
|
|
+| Comparator 比较器排序(本节 3) | Collections.sort(list, comparator) | 函数式接口 & Lambda 简化比较器 |
|