Java中ArrayList的Comparator(i1-i2)实现升序排序原理详解
为什么
(i1, i2) -> i1 - i2能让ArrayList升序排序? 先看你给出的Comparator实现:
Comparator<Integer> ints = (i1, i2) -> i1 - i2;
要理解它的作用,得先明确Java中Comparator接口的compare(i1, i2)方法的返回规则:
- 返回负数:表示
i1应该排在i2的前面 - 返回0:表示
i1和i2的相对位置无需改变 - 返回正数:表示
i1应该排在i2的后面
这个Lambda表达式本质就是实现了上述规则:
- 当
i1 < i2时,i1 - i2是负数 →i1排在i2前面,符合升序逻辑 - 当
i1 == i2时,返回0 → 两者位置不变 - 当
i1 > i2时,i1 - i2是正数 →i1排在i2后面(也就是i2排前面),同样符合升序逻辑
接下来结合初始数组[5, 4, 1, 2],用直观的冒泡排序步骤(Java实际排序用TimSort,冒泡更易理解)演示整个过程:
排序步骤演示
初始数组:[5, 4, 1, 2]
第一轮遍历(将最大元素移至末尾)
- 对比元素5和4:
5-4=1(正数)→ 5应排在4后面,交换位置后数组变为[4, 5, 1, 2] - 对比元素5和1:
5-1=4(正数)→ 5应排在1后面,交换位置后数组变为[4, 1, 5, 2] - 对比元素5和2:
5-2=3(正数)→ 5应排在2后面,交换位置后数组变为[4, 1, 2, 5]
此时最大元素5已处于正确的末尾位置。
第二轮遍历(处理前3个元素)
- 对比元素4和1:
4-1=3(正数)→ 4应排在1后面,交换位置后数组变为[1, 4, 2, 5] - 对比元素4和2:
4-2=2(正数)→ 4应排在2后面,交换位置后数组变为[1, 2, 4, 5]
此时第二大元素4已处于正确位置。
第三轮遍历(处理前2个元素)
对比元素1和2:1-2=-1(负数)→ 1应排在2前面,无需交换,数组保持[1, 2, 4, 5]
至此排序完成,最终得到升序数组。
内容的提问来源于stack exchange,提问作者Anish Ghimire
相关产品推荐
相关产品推荐

