在 Java 中,Comparator 本身不保证稳定排序,是否稳定取决于使用的排序算法。
如果你希望排序是稳定的,需要同时满足两个条件:
稳定排序是指:
相等元素的相对顺序在排序后保持不变
例如:
原顺序:
(1, "A")
(2, "B")
(1, "C")
按第一个字段排序后(稳定):
(1, "A")
(1, "C")
(2, "B")
如果 "A" 和 "C" 的顺序被交换,就不是稳定排序。
Collections.sort(List)Collections.sort(list, comparator);
✅ 推荐用于稳定排序
List.sort(Comparator)(Java 8+)list.sort(comparator);
Collections.sort 底层一致Arrays.sort(T[])(对象数组)Arrays.sort(array, comparator);
⚠️ 官方文档未承诺稳定
Stream.sorted(comparator)list.stream()
.sorted(comparator)
.collect(Collectors.toList());
❌ 不建议用于依赖稳定性的场景
Comparator<Person> comparator = Comparator
.comparing(Person::getAge)
.thenComparing(Person::getName); // 次级排序
Comparator<Person> comparator = (a, b) -> {
if (a.getAge() != b.getAge()) {
return a.getAge() - b.getAge();
}
return Math.random() > 0.5 ? 1 : -1; // ❌ 随机顺序
};
即使排序算法稳定,比较器本身不稳定,最终结果也不稳定。
Collections.sortCollections.sort(list, comparator);
✅ 最简单、最安全
class Indexed<T> {
T value;
int index;
}
listWithIndex.sort(Comparator
.comparing((Indexed<T> i) -> i.value, comparator)
.thenComparingInt(i -> i.index));
✅ 适用于任何排序算法
✅ 稳定排序的“终极方案”
| 排序方式 | 是否稳定 | 建议 |
|---|---|---|
Collections.sort |
✅ 稳定 | ⭐ 推荐 |
List.sort |
✅ 稳定 | ⭐ 推荐 |
Arrays.sort |
❌ 不稳定 | ⚠️ 慎用 |
Stream.sorted |
❌ 不保证 | ⚠️ 慎用 |
| 自定义索引兜底 | ✅ 万能 | ✅ 高可靠 |
如果你愿意,可以告诉我:
我可以给你一个最合适的稳定排序方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。