在 Java 里,Comparator 本身并不能直接“去重”,它只负责排序或比较。
“去重”通常需要结合 Set / Stream / 自定义 equals & hashCode 来实现。
下面按常见场景给你总结几种做法。
用 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() == 0equals() / hashCode()List<Person> result = list.stream()
.sorted(Comparator.comparing(Person::getAge))
.collect(Collectors.toList());
但 distinct() 不走 Comparator,它用的是 equals()。
所以如果你想用 Comparator 去重,不能用 distinct()。
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));
Set<Person> set = new TreeSet<>(
Comparator
.comparing(Person::getName)
.thenComparing(Person::getAge)
);
set.addAll(list);
只要 name + age 相同,就视为重复。
❌ 错误理解:
list.sort(comparator); // 不会去重
✅ 正确理解:
sort():只排序TreeSet / Map:才能去重Comparator 只负责“怎么算一样”,去重要交给 Set / Map
如果你愿意,可以告诉我:
我可以给你最合适的代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。