有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何从java arraylist中删除重复对象

我需要从对象的arraylist中删除重复的对象。我通过制作对象的数组列表来尝试它。第一个包含所有对象,包括重复对象,另一个仅包含唯一对象

ArrayList<ListTableClass> ltc = new ArrayList<ListTableClass>();//has duplicate
ArrayList<ListTableClass> ltc2 = new ArrayList<ListTableClass>();//unique

我使用contains方法来检查是否存在类似这样的副本:

for (ListTableClass element : ltc) {
          if (!ltc2.contains(element)) {
            ltc2.add(element);
          }
    }

但这不会删除重复项。它将ltc的所有元素添加到ltc2中。不知道为什么?ltc确实包含重复的对象


共 (1) 个答案

  1. # 1 楼答案

    因为ArrayList的函数“contains”在其函数hashcode&;等于,因此必须重写函数“hashCode”&;类ListTableClass的“等于”

    例如:

    import java.util.ArrayList;
    public class ListTableClass {
        private String name;
        private int age;
    
    public ListTableClass(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    public static void main(String[] args) {
        ArrayList<ListTableClass> ltc = new ArrayList<ListTableClass>();// has duplicate
        ListTableClass obj0 = new ListTableClass("A", 0);
        ListTableClass obj1 = new ListTableClass("B", 1);
        ListTableClass obj2 = new ListTableClass("C", 2);
        ListTableClass obj3 = new ListTableClass("A", 0);
        ltc.add(obj0);
        ltc.add(obj1);
        ltc.add(obj2);
        ltc.add(obj3);
        ArrayList<ListTableClass> ltc2 = new ArrayList<ListTableClass>();// unique
        for (ListTableClass element : ltc) {
            if (!ltc2.contains(element)) {
                System.out.println(element);
                ltc2.add(element);
            }
        }
    }
    }
    

    覆盖哈希代码之前的输出:

    y2015.m06.d10.ListTableClass@659e0bfd //obj0 {"A", 0}
    y2015.m06.d10.ListTableClass@2a139a55 //obj1 {"B", 1}
    y2015.m06.d10.ListTableClass@15db9742 //obj2 {"C", 2}
    y2015.m06.d10.ListTableClass@6d06d69c //obj3 {"A", 0} is different from obj0
    

    添加覆盖函数哈希代码:

    @Override
     public int hashCode() {
     final int prime = 31;
     int result = 1;
     result = prime * result + age;
     result = prime * result + ((name == null) ? 0 : name.hashCode());
     return result;
     }
    
        @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ListTableClass other = (ListTableClass) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    

    那么输出是:

    y2015.m06.d10.ListTableClass@402 //obj0
    y2015.m06.d10.ListTableClass@422 //obj1
    y2015.m06.d10.ListTableClass@442 //obj2
    

    由于obj3的hashcode&;其性质与obj0相同