【问题标题】:Find duplicates in ArrayList在 ArrayList 中查找重复项
【发布时间】:2013-05-03 13:59:59
【问题描述】:

谁能告诉我导师提供的代码中的以下行应该做什么?

if (data.contains(entry))

完整方法:

public String add(Entry entry) {
    if (entry == null)
      return "Error: null entry";
    if (data.contains(entry))
      return "Error: this entry already in the book";

    boolean done = data.add(entry);    
    if (done)
      return " entry added";
    else
      return "entry could not be added";
  }

我认为它正在检查 ArrayList 中具有相同详细信息的现有条目,但是当我添加重复条目时,它不会进入 if 语句,所以认为我假设错了?我在互联网上搜索,它说它是为此目的,那么为什么它对我不起作用?

【问题讨论】:

  • 您是否尝试过比较 if 之外的对象,看看它们是否相同(使用 equals 方法)? docs.oracle.com/javase/6/docs/api/java/util/…
  • @rockskull 没有对这个类中的方法做任何事情,因为我们无论如何都无法修改它。我们扩展了给定的类来创建地址簿。他一定是想让我们以某种方式使用这个包含,否则他们为什么要把它放在那里?
  • 另外,值得指出的是,从 Java 方法返回字符串状态是不正常的。相反,如果您没有有意义的返回值,请将其设为 void 方法。如果出现问题,抛出异常。
  • @DuncanJones 我只希望我能做到。我们必须在程序中使用异常,我希望将它们从这个类中抛出,但是因为我们不允许修改它,所以我问他我将在哪里包含异常以及他们希望我们将它们放入以验证用户输入在我认为错误的表格上。
  • @ToniHopkins 你的老师听起来是个真正的赢家:-)

标签: java arraylist


【解决方案1】:

请记住,contains()equals() 执行相等性检查。因此,除非您的对象覆盖该方法,否则除非它们是相同的对象引用,否则它不会认为对象相等。

当然,不要在不覆盖 hashCode() 的情况下覆盖 equals()

最后,如果您不想重复对象,请考虑使用Set

【讨论】:

  • 澄清一下,如果你不重载equals 没有两个非原始对象实例将被认为是相等的(因为它使用实例的内存地址),因此@987654328 @ 将始终返回 false。
  • @DuncanJones 我无论如何都不能修改这个方法(任何类)所以这是否意味着如果它实际上不检查重复条目就没有任何意义?对 java 不熟悉的应用程序
  • @ToniHopkins 说清楚,你能编辑Entry 类吗?
  • @DuncanJones 不,我无论如何都不允许碰这个类。我曾多次被告知此类中的代码令人震惊。我认为这是最让我感到压力的事情,因为人们一直在建议做事的最佳方法,但我不允许实施它们。
  • @ToniHopkins 如果您无法更改代码,为什么要发布问题? :-)
【解决方案2】:

检查你的 equals() 和 hashcode()

【讨论】:

    【解决方案3】:

    List 的contains() 方法你会看到它使用equals() 方法来评估两个对象是否相同。

    内部逻辑as per docs

    (o==null ? e==null : o.equals(e));
    

    所以你必须ovverideequals方法compare他们

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 2021-12-24
      • 2017-03-16
      • 1970-01-01
      相关资源
      最近更新 更多