如何在ArrayList 中查找重复项?

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

说我有这个数组列表:

List arrayList = new List; MyDataClass{ String name; String age; } 

现在,我需要在MyDataClass根据age找到重复MyDataClass并删除它们。 如何使用像这里描述的HashSet这样的东西呢?

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

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

我建议你覆盖equalshashCodeHashSet依赖于两者!)

要删除重复项,您只需使用ArrayList作为参数创建一个新的HashSet ,然后清除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); } } 

然后呢

 List arrayList = new ArrayList(); Set uniqueElements = new HashSet(arrayList); arrayList.clear(); arrayList.addAll(uniqueElements); 

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

然后我建议你做一些提供这些方法的装饰器类。

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

如果您无法覆盖“MyDataClass”的hashCode和equals方法,您可以编写一个处理此问题的包装类。

请参阅这篇文章 ,它解释了equals()hashCodeHashSets

此外,请参阅此前回答的问题

 public Set findDuplicates(List list) { Set items = new HashSet(); Set duplicates = new HashSet(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; }