java List对象集合中 如何根据集合中对象某几个属性组合去重

在Java中,如果你想要根据一个List中的对象的几个属性进行去重,可以使用以下几种方法:

方法一:使用 Set 和自定义的 equals() 和 hashCode()

你可以创建一个自定义类,并为这个类实现equals()和hashCode()方法。然后使用HashSet来存储这些对象,因为HashSet不允许重复元素。

java 复制代码
class MyClass {
    private String attr1;
    private String attr2;

    // 构造函数
    public MyClass(String attr1, String attr2) {
        this.attr1 = attr1;
        this.attr2 = attr2;
    }

    // getter 和 setter 省略...

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null || getClass() != obj.getClass())
            return false;
        MyClass other = (MyClass) obj;
        return attr1.equals(other.attr1) && attr2.equals(other.attr2);
    }

    @Override
    public int hashCode() {
        return attr1.hashCode() ^ attr2.hashCode();
    }
}

// 使用示例
List<MyClass> list = new ArrayList<>();
// 填充list...
Set<MyClass> set = new HashSet<>(list);
list.clear();
list.addAll(set); // 去重后的list

方法二:使用 Java 8 及以上版本的 Stream API

利用Java 8的Stream API,可以简化代码。通过收集器Collectors.toCollection()与LinkedHashSet保证插入顺序。

java 复制代码
List<MyClass> distinctList = list.stream()
    .collect(Collectors.toCollection(LinkedHashSet::new))
    .stream()
    .collect(Collectors.toList());```

如果需要根据特定属性去重,可以使用distinct()结合Comparator或更复杂的逻辑。
方法三:使用 Collectors.groupingBy 和 findFirst

这种方法可以确保只保留每个组的第一个元素:

java 复制代码
Map<String, MyClass> result = list.stream()
    .collect(Collectors.toMap(
        o -> o.getAttr1() + o.getAttr2(), // key generator
        Function.identity(), // value mapper
        (oldValue, newValue) -> oldValue // merge function
    ));
List<MyClass> distinctList = new ArrayList<>(result.values());

这里,键是属性组合的字符串表示形式,而值则是MyClass对象本身。请注意这种方法可能不会保持元素的原始顺序。

相关推荐
苏生Susheng29 分钟前
【软件实施】Linux企业运维常用命令手册
java·linux·运维·服务器·springboot·springcloud·软件实施
想要成为老金高手30 分钟前
Kubernetes 调度器详解:从 nodeName 到污点容忍
java·容器·kubernetes
吴长建先生重名了33 分钟前
ElasticSearch 检索系统性能优化实战:基准测试
java
小白学大数据37 分钟前
超简单:用 Python 让 Excel 飞起来:用 openpyxl 把重复报表整理交给脚本
开发语言·数据库·python·excel
西索斯coding41 分钟前
doubao-seed-2.1-turbo 调用一直 401 怎么办?pro 版同样的 Key 却正常——5 分钟排查定位指南
java·服务器·数据库·ai
旧梦95271 小时前
Java SortedMap 接口详解:从入门到实战
java·开发语言
莫陌尛.1 小时前
Java_this构造方法
java·开发语言
2601_962297251 小时前
C# vs Java vs Python:YOLO工业部署性能对比实战
java·python·c·工业视觉·性能对比
计算机毕设定制辅导-无忧学长1 小时前
《基于SpringBoot的马术俱乐部管理系统》
java·spring boot·后端
Persistent的粽子!1 小时前
C++:类与对象(二)
开发语言·c++