如何比较两个对象数组以删除重复项?

时间:2017-12-27 13:08:29

标签: java android arraylist duplicates

我正在使用两个对象数组来删除重复的对象。

我有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中删除重复元素。

2 个答案:

答案 0 :(得分:2)

您可以使用removeAll方法删除list1list2中存在的元素。首先,您必须覆盖类中的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'}]

修改

不覆盖equalshashCode的另一种方法是使用removeIf方法(自java 8起可用):

list1.removeIf(c -> list2.stream()
                    .map(Class1::getName)
                    .anyMatch(n -> n.equals(c.getName())));

这里我删除list1上的每个元素,其名称等于list2上元素的名称。

答案 1 :(得分:0)

将两个列表合并到单个列表中并将其发送到自定义函数下面:

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());;
}