如何防止将重复对象添加到数组列表

2022-09-02 22:51:25

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

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

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

类 C 有两个属性,即。

String str1;
String str2;

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

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


答案 1

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

您可以从以下选项中选择一种 -

  • 哈希集

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

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

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

请注意,要使此功能正常工作,您需要覆盖并告诉如何比较对象。在 Java 中重写 equals 和 hashCode 时应考虑哪些问题中可以更好地解释此步骤?equalshashcodeSet


答案 2

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

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

如果像这样重写 equals 方法,则还应确保重写 hashcode() 方法。请参见: http://www.technofundo.com/tech/java/equalhash.html

编辑:正如注释中指出的那样,集合实现将更加高效,尽管您仍然需要覆盖等于/哈希码方法,因此上述示例可能最好与上面的Karthiks答案结合使用。