可能重复:
防止ArrayList中的重复项
我有一个特别的C类的ArrayList
List<C> myList = new ArrayList<C>();
C类有两个属性即
String str1;
String str2;
现在,当,当我加入C型到ArrayList myList中的对象,我想检查是否已经存在与str1和str2的匹配参数的值对象的值(str1和STR2)列表中的对象我要补充。
是否有任何有效的方式来做到这一点,而无需通过完整的列表,每次迭代和检查参数之间的匹配?
你需要重写equals
的C类方法
如
public boolean equals(Object c) {
if(c !instanceof C) {
return false;
}
C that = (C)c;
return this.str1.equals(that.getStr1()) && this.str2.equals(that.getStr2());
}
然后,你可以调用myList.contains(即),看看是否列表中已包含相同的对象。
这是未经测试,您可能希望其他一些错误处理。
如果你重写equals方法这样,你也应该确保你重写了hashCode()方法的方法。 请参阅: http://www.technofundo.com/tech/java/equalhash.html
编辑 :正如在评论中指出,这组实施将是更有效的,但你仍然需要重载equals / hashCode方法使上面的例子中可以结合最好使用Karthiks回答以上。
当你需要重复检查或保证唯一值,可以考虑使用一个设置 -如数据结构,而不是一个列表。
您可以从下面的一个选择 -
HashSet的
- 更快的访问 - O(1)访问粗略地说。
- 没有排序
- 用作基础的存储的哈希表。
TreeSet中
- 访问速度较慢的(相对于HashSet的) - O(日志(N))
- 值自动排序。
- 作为基本存储红黑树。
自动设置只允许唯一值。 试图添加先前存在失败值。
需要注意的是这个工作,你需要重写equals
和hashcode
告诉Set
如何比较的对象。 此步骤是在更好地解释哪些问题应该在Java中覆盖equals和hashCode时,应考虑?
if (yourList.contains(Object object))
{
// do not add
}