如何在ArrayList 中查找重复项?
这是一个非常常见的问题,但我找不到这个部分:
说我有这个数组列表:
List arrayList = new List; MyDataClass{ String name; String age; }
现在,我需要在MyDataClass
根据age
找到重复MyDataClass
并删除它们。 如何使用像这里描述的HashSet这样的东西呢?
我想,我们需要在MyDataClass中覆盖equals
?
- 但是,如果我没有这样做的奢侈呢?
- HashSet如何实际内部查找并且不添加重复项? 我在OpenJDK中看到它的实现,但无法理解。
我建议你覆盖equals
和hashCode
( HashSet
依赖于两者!)
要删除重复项,您只需使用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()
和hashCode
对HashSets
此外,请参阅此前回答的问题
public Set