java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java list对象去重

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

作者:北漂编程小王子

本文介绍Java中基于对象属性去重的三种方法,各方法在保持顺序和实现复杂度上有所不同,适用于不同场景,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

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

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

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

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

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保证插入顺序。

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

如果需要根据特定属性去重,可以使用distinct()结合Comparator或更复杂的逻辑。

方法三:使用 Collectors.groupingBy 和 findFirst

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

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对象本身。请注意这种方法可能不会保持元素的原始顺序。

扩展:java list集合三种去重方法

java list集合三种去重方法

public class ListDistinct <T>{
    /**
     * 通过set去重, 不打乱原有list的顺序
     *       list中相同的对象会被去重复
     *      
     * @param List<T> list
     * @return List<T>
     * */
    public List<T> distinctBySetOrder(List<T> list){
        Set<T> set = new  HashSet<T>(); 
        List<T> newList = new  ArrayList<T>(); 
        for (T t :list) {
           if(set.add(t)){
               newList.add(t);
           }
        }
        return newList;
    }
    /**
     * 通过set去重, 顺序可能会乱
     *       list中相同的对象会被去重复
     *      
     * @param List<T> list
     * @return List<T>
     * */
    public List<T> distinctBySet(List<T> list){
        return new ArrayList<T>(new HashSet<T>(list));
    }
    /**
     * 通过遍历判断后将赋予新的集合
     * 
     * @param List<T>
     * @reutrn List<T>
     * */
    public List<T> distinctByANewList(List<T> list){
        List<T> newList = new  ArrayList<T>(); 
        for(T t : list){
            if(!newList.contains(t)){
                newList.add(t);
            }
        }
        return newList;
    }
    public static void main(String[] args){
        ListDistinct<String> ld = new ListDistinct<String>();
        List<String> list  =   new  ArrayList<String>(); 
        list.add("zhang");
        list.add("zhang");
        list.add("ss");
        list.add("ss");
        list.add("2s");
        list.add("s3");
        System.out.println("1:" + ld.distinctBySetOrder(list).toString());
        System.out.println("2:" + ld.distinctBySet(list).toString());
        System.out.println("3:" + ld.distinctByANewList(list).toString());
    }
}

到此这篇关于Java List对象集合中 如何根据集合中对象某几个属性组合去重的文章就介绍到这了,更多相关java list集合对象去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文