温馨提示×

温馨提示×

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

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

java Comparator 怎样去重

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

在 Java 里,Comparator 本身并不能直接“去重”,它只负责排序或比较。
“去重”通常需要结合 Set / Stream / 自定义 equals & hashCode 来实现。

下面按常见场景给你总结几种做法。


一、按 Comparator 定义的“相同规则”去重(最常见)

✅ 思路

用 TreeSet(Comparator),只要 Comparator 认为两个对象“相等”,就会被去重

List<Person> list = ...;

Set<Person> set = new TreeSet<>(
    Comparator.comparing(Person::getName)
);

set.addAll(list);

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

⚠️ 注意:

  • TreeSet 去重的依据是 Comparator.compare() == 0
  • 不依赖 equals() / hashCode()

二、Stream + Comparator + distinct(先排序再去重)

List<Person> result = list.stream()
    .sorted(Comparator.comparing(Person::getAge))
    .collect(Collectors.toList());

但 distinct() 不走 Comparator,它用的是 equals()。

所以如果你想用 Comparator 去重,不能用 distinct()。


三、用 Comparator + Map 手动去重(推荐,最灵活)

✅ 保留“第一个”或“最后一个”

Map<String, Person> map = new LinkedHashMap<>();

list.forEach(p ->
    map.putIfAbsent(p.getName(), p)
);

List<Person> result = new ArrayList<>(map.values());

或按年龄去重:

Map<Integer, Person> map = new HashMap<>();
list.forEach(p -> map.putIfAbsent(p.getAge(), p));

四、多个字段组合 Comparator 去重

Set<Person> set = new TreeSet<>(
    Comparator
        .comparing(Person::getName)
        .thenComparing(Person::getAge)
);

set.addAll(list);

只要 name + age 相同,就视为重复。


五、如果你“以为 Comparator 能去重”的误区

❌ 错误理解:

list.sort(comparator); // 不会去重

✅ 正确理解:

  • sort():只排序
  • TreeSet / Map:才能去重

六、总结一句话

Comparator 只负责“怎么算一样”,去重要交给 Set / Map

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

  • 去重字段是什么?
  • 是否要保留第一个 / 最后一个?
  • Java 版本(8 / 17)

我可以给你最合适的代码。

向AI问一下细节

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

AI
助
手