在 Java 里,Comparator 本身不能去重,它只负责“排序/比较”。
是否“去重”取决于你用的是什么集合,以及你用什么标准认为两个对象“相同”。
下面按常见场景说明做法。
equals / hashCode 去重(最常见)这是 Java 集合的默认去重规则。
Set<Student> set = new HashSet<>(list);
✅ 只要 Student 正确重写 equals 和 hashCode
如果你希望:
只要 Comparator 返回 0,就认为是重复元素
那你需要用 TreeSet / TreeMap
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 使用 Comparatorcompare(a, b) == 0 时,认为 a 和 b 相同⚠️ 注意:
Comparator<Student> cmp = Comparator
.comparing(Student::getAge)
.thenComparing(Student::getName);
Set<Student> set = new TreeSet<>(cmp);
set.addAll(list);
✅ 年龄 + 姓名 都相同 → 去重
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());
new HashSet<>(comparator) // 不存在
HashSet 不用 Comparator
如果 compare == 0 但 equals == false:
| 需求 | 方案 |
|---|---|
| 按 equals 去重 | HashSet |
| 按 Comparator 去重 | TreeSet |
| 去重 + 排序 | TreeSet |
| 去重但不排序 | Stream + TreeSet |
| 保留最后一个 | Map |
如果你有具体对象 + 去重规则,我可以直接帮你写完整代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。