如何在ArrayList <Object>中查找重复项?

zen*_*ngr 10 java collections

这是一个非常常见的问题,但我找不到这个部分:

说我有这个数组列表:

List<MyDataClass> arrayList = new List<MyDataClass>;

MyDataClass{
   String name;
   String age;
}
Run Code Online (Sandbox Code Playgroud)

现在,我需要age在in 的基础上找到重复项MyDataClass并删除它们.如何使用像这里描述的HashSet这样的东西呢?

我想,我们需要equals在MyDataClass中覆盖?

  1. 但是,如果我没有这样做的奢侈呢?
  2. HashSet如何实际内部查找并且不添加重复项?我在OpenJDK看到它的实现,但无法理解.

aio*_*obe 16

我建议你覆盖两者 equalshashCode(HashSet依赖于两者!)

要删除重复项,您只需HashSet使用ArrayList作为参数创建一个new ,然后清除ArrayList并放回存储在其中的元素HashSet.

class MyDataClass {
    String name;
    String age;

    @Override
    public int hashCode() {
        return name.hashCode() ^ age.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof MyDataClass))
            return false;

        MyDataClass mdc = (MyDataClass) obj;
        return mdc.name.equals(name) && mdc.age.equals(age);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后呢

List<MyDataClass> arrayList = new ArrayList<MyDataClass>();

Set<MyDataClass> uniqueElements = new HashSet<MyDataClass>(arrayList);
arrayList.clear();
arrayList.addAll(uniqueElements);
Run Code Online (Sandbox Code Playgroud)

但是,如果我没有这样做的奢侈呢?

然后,我建议你做一些装饰-类的确实提供了这些方法.

class MyDataClassDecorator {

    MyDataClass mdc;

    public MyDataClassDecorator(MyDataClass mdc) {
        this.mdc = mdc;
    }

    @Override
    public int hashCode() {
        return mdc.name.hashCode() ^ mdc.age.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof MyDataClassDecorator))
            return false;

        MyDataClassDecorator mdcd = (MyDataClassDecorator) obj;
        return mdcd.mdc.name.equals(mdc.name) && mdcd.mdc.age.equals(mdc.age);
    }
}
Run Code Online (Sandbox Code Playgroud)