Java比较器
1. 什么是比较器?
比较器就是告诉程序"如何比较两个元素"的规则。
2. 基本语法
Arrays.sort(intervals, new Comparator<int[]>() {@Overridepublic int compare(int[] a, int[] b) {return Integer.compare(a[0], b[0]);}
});
简化写法(Lambda表达式)
Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
参数含义
(a,b)->Integer.compare(a[0],b[0]);
- a:第一个区间,比如 [1,3]
- b:第二个区间,比如 [2,6]
- a[0]:第一个区间的起始点,比如 1
- b[0]:第二个区间的起始点,比如 2
比较规则
Integer.compare(a[0], b[0])
这个函数的作用:
- 如果 a[0] < b[0],返回负数(-1)
- 如果 a[0] == b[0],返回0
- 如果 a[0] > b[0],返回正数(1)
具体例子
// 假设有两个区间
int[] a = {1, 3}; // 区间 [1,3]
int[] b = {2, 6}; // 区间 [2,6]// 比较 a[0] 和 b[0]
Integer.compare(1, 2) // 1 < 2,返回负数
// 结果:-1// 这意味着 [1,3] 应该排在 [2,6] 前面
排序过程演示
// 原始数组
int[][] intervals = {{2,6}, {1,3}, {8,10}};// 排序过程:
// 1. 比较 [2,6] 和 [1,3]
// Integer.compare(2, 1) = 1 (正数)
// 所以 [2,6] 排在 [1,3] 后面// 2. 比较 [2,6] 和 [8,10]
// Integer.compare(2, 8) = -1 (负数)
// 所以 [2,6] 排在 [8,10] 前面// 最终排序结果:[[1,3], [2,6], [8,10]]
其他比较器例子
按结束点排序
(a, b) -> Integer.compare(a[1], b[1])
按区间长度排序
(a, b) -> Integer.compare(a[1] - a[0], b[1] - b[0])
先按起始点,再按结束点排序
(a, b) -> {if (a[0] != b[0]) {return Integer.compare(a[0], b[0]);}return Integer.compare(a[1], b[1]);
}
总结
(a, b) -> Integer.compare(a[0], b[0])
这个比较器的含义是:
- 比较两个区间的起始点
- 起始点小的排在前面
- 起始点大的排在后面
这就是Java中定义比较器的标准语法!
sort的排序规则
Arrays.sort() 就是根据比较器返回的 -1、0、1 来决定排序顺序的:
返回值含义:
- -1:第一个元素应该排在第二个元素前面
- 0:两个元素相等,顺序不变
- 1:第一个元素应该排在第二个元素后面
具体例子
int[][] intervals = {{2,6}, {1,3}, {8,10}};// 排序过程:
// 1. 比较 [2,6] 和 [1,3]
// Integer.compare(2, 1) = 1
// 返回1,所以 [2,6] 排在 [1,3] 后面// 2. 比较 [2,6] 和 [8,10]
// Integer.compare(2, 8) = -1
// 返回-1,所以 [2,6] 排在 [8,10] 前面// 最终结果:[[1,3], [2,6], [8,10]]
Integer.compare() 的返回值
Integer.compare(a, b) 的返回值:如果 a < b,返回 -1
如果 a == b,返回 0
如果 a > b,返回 1
验证示例
public class SortDemo {public static void main(String[] args) {int[][] intervals = {{2,6}, {1,3}, {8,10}};System.out.println("排序前:" + Arrays.deepToString(intervals));// 演示比较过程System.out.println("\n比较过程:");System.out.println("Integer.compare(2, 1) = " + Integer.compare(2, 1)); // 1System.out.println("Integer.compare(2, 8) = " + Integer.compare(2, 8)); // -1System.out.println("Integer.compare(1, 8) = " + Integer.compare(1, 8)); // -1// 执行排序Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));System.out.println("\n排序后:" + Arrays.deepToString(intervals));}
}
输出结果
排序前:[[2,6], [1,3], [8,10]]比较过程:
Integer.compare(2, 1) = 1
Integer.compare(2, 8) = -1
Integer.compare(1, 8) = -1排序后:[[1,3], [2,6], [8,10]]
总结
您的理解完全正确!
- sort() 就是根据 -1、0、1 来排序的
- -1 = 排在前面
- 0 = 顺序不变
- 1 = 排在后面
这就是Java排序算法的核心机制!