如何比较两个对象数组以删除重复项?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何比较两个对象数组以删除重复项?相关的知识,希望对你有一定的参考价值。
我正在使用两个对象数组来删除重复的对象。
我有Class1.java的array1
String name;
String number;
我添加了如下对象:
list1.add(new Class1("name1","number1"));
list1.add(new Class1("name2","number2"));
list1.add(new Class1("name3","number3"));
list1.add(new Class1("name4","number4"));
list2.add(new Class1("name1","number1"));
list2.add(new Class1("name5","number2"));
list2.add(new Class1("name6","number3"));
list2.add(new Class1("name2","number4"));
现在我想在名称的基础上比较list1和list 2。在与列表2进行比较后,如何从list1中删除重复元素。
答案
您可以使用list1
方法删除list2
上存在的removeAll中的元素。首先,您必须覆盖类中的equals和hashCode方法:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Class1)) return false;
Class1 class1 = (Class1) o;
return name.equals(class1.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
然后添加元素后,只需使用方法removeAll
,如下所示:
list1.add(new Class1("name1","number1"));
list1.add(new Class1("name2","number2"));
list1.add(new Class1("name3","number3"));
list1.add(new Class1("name4","number4"));
list2.add(new Class1("name1","number1"));
list2.add(new Class1("name5","number2"));
list2.add(new Class1("name6","number3"));
list2.add(new Class1("name2","number4"));
list1.removeAll(list2);
删除元素后list1
:
[Class1 {name ='name3'},Class1 {name ='name4'}]
编辑
另一种没有覆盖equals
和hashCode
的方法是使用removeIf方法(自java 8起可用):
list1.removeIf(c -> list2.stream()
.map(Class1::getName)
.anyMatch(n -> n.equals(c.getName())));
在这里,我将删除list1
上的每个元素,其名称等于list2
上元素的名称。
另一答案
将两个列表合并为单个列表并将其发送到自定义函数下方:
HashMap存储唯一键,从自己的类中选择任何字段(唯一值),并将该字段值作为键设置为HashMap,将类对象设置为值。
private List<Class1> clearListFromDuplicateFirstName(List<Class1> combineList) {
Map<String, Class1> cleanMap = new LinkedHashMap<String, Class1>();
for (int i = 0; i < combineList.size(); i++) {
cleanMap.put(combineList.get(i).getname(), combineList.get(i));
}
return new ArrayList<Class1>(cleanMap.values());;
}
以上是关于如何比较两个对象数组以删除重复项?的主要内容,如果未能解决你的问题,请参考以下文章