17

可能重复:
防止数组列表中的重复条目

我有一个特定 C 类的数组列表。

List<C> myList = new ArrayList<C>();

C类有两个属性,即。

String str1;
String str2;

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

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

4

3 回答 3

40

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

您可以选择以下之一 -

  • 哈希集

    • 更快的访问 - 粗略地说 O(1) 访问。
    • 未排序
    • 哈希表用作基本存储。
  • 树集

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

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

请注意,要使其正常工作,您需要覆盖equalshashcode告诉Set如何比较您的对象。在 Java 中覆盖 equals 和 hashCode时应该考虑哪些问题?

于 2013-01-07T08:50:42.320 回答
19

您需要覆盖equalsC 类中的方法。

例如

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

这是未经测试的,您可能需要一些额外的错误处理。

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

编辑:正如评论中所指出的,set 实现将更加高效,尽管您仍然需要覆盖 equals / hashcode 方法,因此上述示例可能最好与上面的 Karthik 答案结合使用。

于 2013-01-07T08:51:48.127 回答
12
if (yourList.contains(Object object))
{
    // do not add
}
于 2013-01-07T08:51:30.633 回答