温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Comparator 怎么稳定排序

发布时间:2026-10-24 09:06:15 来源:亿速云 阅读:100 作者:小樊 栏目:编程语言

在 Java 里,Comparator 本身并不能保证“稳定排序”,是否稳定取决于你使用的排序方法。


一、什么是稳定排序?

稳定排序:相等元素在排序后,原有相对顺序不变。

例如:

list = [ (2,"a"), (1,"b"), (2,"c") ]
按数字排序后:
(1,"b"), (2,"a"), (2,"c")   // a 仍在 c 前面 ✅ 稳定

二、Java 中哪些排序是稳定的?

✅ 1. List.sort(Comparator)(推荐)

list.sort(Comparator.comparingInt(Item::getNum));
  • 稳定
  • Java 8+ 使用 TimSort
  • 内部实现稳定

✅ 这是最常用、最安全的方式


✅ 2. Collections.sort(List, Comparator)

Collections.sort(list, comparator);
  • 稳定
  • 内部调用 list.sort()

❌ 3. Arrays.sort(Object[])

Arrays.sort(array, comparator);
  • 不稳定
  • 使用 归并排序的变体,但在旧版本不稳定
  • Java 官方文档未保证稳定

⚠️ 不建议用于需要稳定性的场景


❌ 4. 自己写的快排 / 堆排

  • 一般都不稳定
  • 除非特别处理

三、如何用 Comparator 做到“逻辑稳定”?

有时候 两个元素 comparator 返回 0,但你想保持原顺序。

✅ 方案 1:用 thenComparing 补充排序条件

list.sort(
    Comparator
        .comparingInt(Item::getNum)
        .thenComparingInt(Item::getIndex) // 原顺序索引
);

✅ 方案 2:给元素加“原始序号”

class Item {
    int num;
    int order; // 插入顺序
}
list.sort(
    Comparator.comparingInt(Item::getNum)
              .thenComparingInt(Item::getOrder)
);

四、总结(记住这张表)

方法 是否稳定 建议
List.sort(Comparator) ✅ 稳定 ⭐ 推荐
Collections.sort ✅ 稳定 ✅
Arrays.sort(Object[], Comparator) ❌ 不稳定 ⚠️
手动排序 ❌ 一般不稳定 ❌

如果你愿意,可以告诉我:

  • 用的是什么集合(List / 数组)
  • Java 版本
  • 是否需要多级排序

我可以给你更具体的代码示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手