如何防止将重复对象添加到ArrayList

可能重复:
防止arraylist中的重复条目

我有一个特定class级C的arraylist。

List myList = new ArrayList(); 

C类有两个属性即。

 String str1; String str2; 

现在,当我将类型C的对象添加到ArrayList myList时,我想检查列表中是否已存在一个对象,其中str1和str2的值与对象的参数(str1和str2)的值相匹配我即将补充。

是否有任何有效的方法来做到这一点,而不必每次遍历完整列表并检查参数之间的匹配?

您需要覆盖C类中的equals方法。

例如

 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(即)来查看列表是否已经包含一个相等的对象。

这是未经测试的,您可能需要一些额外的error handling。

如果你像这样覆盖equals方法,你还应该确保覆盖hashcode()方法。 请参阅: http : //www.technofundo.com/tech/java/equalhash.html

编辑 :正如评论中指出的那样,set实现会更有效,尽管你仍然需要覆盖equals / hashcode方法,所以上面的例子最好与上面的Karthiks答案一起使用。

当您需要检查重复项或确保唯一值时,请考虑使用类似Set的数据结构,而不是List。

您可以选择以下其中一种 –

  • HashSet的

    • 更快的访问 – 粗略地说O(1)访问。
    • 没有排序
    • 哈希表用作基本存储。
  • TreeSet中

    • 访问速度较慢(相对于HashSet) – O(log(n))
    • 值自动排序。
    • 红黑树用作基础存储。

自动设置仅允许唯一值。 尝试添加以前存在的值将失败。

请注意,要使其工作,您需要覆盖equalshashcode以告诉Set如何比较对象。 这一步更好地解释了在Java中覆盖equals和hashCode时应该考虑哪些问题?

 if (yourList.contains(Object object)) { // do not add }