【问题标题】:how to compare two array of objects to remove duplicates?如何比较两个对象数组以删除重复项?
【发布时间】:2023-03-24 15:31:01
【问题描述】:

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

我有 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 比较后,如何从列表 1 中删除重复元素。

【问题讨论】:

  • 你尝试过使用HashSet吗?
  • 我尝试使用单个数组列表。
  • 所以您想删除列表 1 中存在于列表 2 中的元素?
  • @JuanCarlosMendoza,是的

标签: java android arraylist duplicates


【解决方案1】:

将两个列表合并为一个列表并将其发送到自定义函数下方:

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

【讨论】:

    【解决方案2】:

    您可以使用removeAll 方法删除存在于list2 上的list1 中的元素。首先,您必须覆盖类中的 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 上的元素名称相同的每个元素。

    【讨论】:

    猜你喜欢
    • 2020-10-16
    • 2021-05-09
    • 2020-05-08
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2015-05-05
    • 2023-03-09
    • 2023-03-15
    相关资源
    最近更新 更多