温馨提示×

温馨提示×

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

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

java Comparator 如何去重

发布时间:2026-10-24 10:18:23 来源:亿速云 阅读:101 作者:小樊 栏目:编程语言

在 Java 里,Comparator 本身不能去重,它只负责“排序/比较”。
是否“去重”取决于你用的是什么集合,以及你用什么标准认为两个对象“相同”。

下面按常见场景说明做法。


一、先明确:去重的“标准”是什么?

1️⃣ 按 equals / hashCode 去重(最常见)

这是 Java 集合的默认去重规则。

Set<Student> set = new HashSet<>(list);

✅ 只要 Student 正确重写 equals 和 hashCode


2️⃣ 按 Comparator 认为“相等”去重(重点)

如果你希望:

只要 Comparator 返回 0,就认为是重复元素

那你需要用 TreeSet / TreeMap


二、用 TreeSet + Comparator 去重(推荐)

示例:按年龄去重

List<Student> list = ...;

Comparator<Student> byAge = Comparator.comparing(Student::getAge);

Set<Student> set = new TreeSet<>(byAge);
set.addAll(list);

List<Student> result = new ArrayList<>(set);

原理

  • TreeSet 使用 Comparator
  • 当 compare(a, b) == 0 时,认为 a 和 b 相同
  • 后加入的会被忽略(去重)

⚠️ 注意:

  • 只会保留第一个
  • 排序顺序由 Comparator 决定

三、按多个字段去重(组合 Comparator)

Comparator<Student> cmp = Comparator
    .comparing(Student::getAge)
    .thenComparing(Student::getName);

Set<Student> set = new TreeSet<>(cmp);
set.addAll(list);

✅ 年龄 + 姓名 都相同 → 去重


四、不想排序,只想“按规则去重”

Java 8+:用 Stream + TreeSet

List<Student> result = list.stream()
    .collect(Collectors.collectingAndThen(
        Collectors.toCollection(
            () -> new TreeSet<>(Comparator.comparing(Student::getAge))
        ),
        ArrayList::new
    ));

五、保留“最后一个”而不是第一个(技巧)

TreeSet 只能保留第一个
如果你想保留最后一个:

Map<Integer, Student> map = new HashMap<>();
for (Student s : list) {
    map.put(s.getAge(), s); // 后面的覆盖前面的
}
List<Student> result = new ArrayList<>(map.values());

六、常见坑 ⚠️

❌ HashSet + Comparator 无效

new HashSet<>(comparator) // 不存在

HashSet 不用 Comparator


❌ Comparator 和 equals 不一致

如果 compare == 0 但 equals == false:

  • TreeSet 会去重
  • HashSet 不会

七、总结

需求 方案
按 equals 去重 HashSet
按 Comparator 去重 TreeSet
去重 + 排序 TreeSet
去重但不排序 Stream + TreeSet
保留最后一个 Map

如果你有具体对象 + 去重规则,我可以直接帮你写完整代码。

向AI问一下细节

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

AI
助
手