繁体   English   中英

合并没有重复项的Model元素的ArrayList

[英]Merging ArrayList of Model elements without duplicates

嗨,我有两个数组列表列表l1和列表l2,名称,年龄,性别,uniqID,标记是列表中的数据。 我想加入l1和l2而没有重复项。uniqID对于每个学生都是唯一的。 我一直在遍历所有元素并比较每个元素。 但是我的清单中大约有2万个项目,因此循环需要太多时间。 我已经尝试过此帖子中的所有答案,但对我没有用。 有什么建议么。?

简单的例子:

public class Person{
    int id;
    String name;
    //fields, getter, setter, constructor omited....

    @Override
    public boolean equals(Object o){
        if (!(o instanceof Person)){
            //implicit null check
            return false;
        }
        return this.id==((Person)o).id;
    }

    @Override
    public int hashCode(){
        return this.id;
    } 
}

Person类现在确实实现了equals和hashCode。 Java使用equals来确定一个对象是否与另一个对象重复。 hashCode本身不是必需的,但建议重写hashCode并使其equals

如果两种方法都实现,则可以简单地使用java中的内置方法和数据结构:

带有列表:

List<Person> listA = new ArrayList<>();
List<Person> listB = new ArrayList<>();
// filling the lists omitted
List<Person> mergedList=new ArrayList<>();
mergedList.addAll(listA);
mergedList.removeAll(listB);
mergedList.addAll(listB);

或搭配:

List<Person> listA = new ArrayList<>();
List<Person> listB = new ArrayList<>();
// filling the lists omitted
Set<Person> mergedSet=new HashSet<>();
mergedSet.addAll(listA);
mergedSet.addAll(listB);

您可以组合两个arraylist并将其传递给HashSet对象,因为Set不包含重复项,您可以执行以下操作

ArrayList<String> a=new ArrayList<String>();
ArrayList<String> b=new ArrayList<String>();

b.addAll(a);

如果要保留元素的顺序,请使用LinkedHashSet

LinkedHashSet<String> result=new LinkedHashSet<String>(b);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM