【问题标题】:Attempting to loop through an ArrayList to find duplicates, if statement never seems to return true尝试遍历 ArrayList 以查找重复项,if 语句似乎永远不会返回 true
【发布时间】:2015-03-21 08:06:53
【问题描述】:

我正在尝试遍历 Card 对象的 ArrayList 以查找重复的卡片。 if 语句用于比较列表中的两个不同对象,如果发现重复,只需将布尔值设置为 true。

public boolean hasDuplicate() {
    boolean isDupe = false;


    for(int a = 0; a < pack.size(); a++){

        for(int b = a + 1; b < pack.size(); b++){

            if (pack.get(a).equals(pack.get(b))){

                isDupe = true;
            }
        }
    }       
    return isDupe;
}

这是我一直用来测试的。

public void testDuplicate(){
    if (pc.hasDuplicate() == true){
        System.out.println("There is a dupe");
    }
    if (pc.hasDuplicate() == false){
        System.out.println("No Dupe");
    }
}

它总是输出“No Dupe”作为切换布尔值的条件语句从不触发。

任何帮助(阅读:指出我明显的错误)将不胜感激。谢谢!

【问题讨论】:

  • 你的 Card 对象是如何实现 equals 的?你如何初始化你的卡片对象列表?
  • 您尚未在 Card 对象中覆盖 equals(Object)。此外,删除所有出现的== true 并将所有x == false 替换为!x。此外,将if (cond) action1; if (!cond) action2; 替换为if (cond) action1; else action2;

标签: java arraylist duplicates conditional-statements


【解决方案1】:

试试这个:

  • Card 正确实施equals()
  • Card 正确实现hashCode(),使得值基于与equals() 中比较的相同字段

然后扔掉循环并编写以下代码:

public boolean hasDuplicate() {
    return new HashSet<Card>(pack).size() == pack.size();
}

【讨论】:

  • 谢谢,通过 Eclipse 中的源代码菜单正确实现 equals 足以让它工作。
【解决方案2】:

问题是在java中对象是默认比较引用。您通常希望按值比较它们,它们被称为值类。

要获得一个值类,你需要覆盖equals的实现,这样它是:

1) 自反 : 对象必须等于自身。

2) 对称:如果 a.equals(b) 为真,则 b.equals(a) 必须为真。

3) 传递性:如果 a.equals(b) 为真且 b.equals(c) 为真,则 c.equals(a) 必须为真。

4) 一致:多次调用 equals() 方法必须产生相同的值,直到任何属性被修改。因此,如果两个对象在 Java 中是相等的,它们将保持相等,直到其中任何一个属性被修改。

5) Null 比较:将任何对象与 null 进行比较必须为 false,并且不应导致 NullPointerException。例如 a.equals(null) 必须为 false,将可能为 null 的未知对象传递给 Java 中的 equals 实际上是避免 Java 中出现 NullPointerException 的 Java 编码最佳实践。

阅读更多:http://javarevisited.blogspot.com/2011/02/how-to-write-equals-method-in-java.html#ixzz3PYg2fWPM (或阅读有效的 Java:Joshua Bloch)

【讨论】:

    【解决方案3】:
    public boolean equals(Object obj)
    

    指示其他对象是否“等于”这个对象。 Read more

    如果你比较两个不同的对象,你需要在你的类中实现equlas()方法,你必须在Card类中实现equals()方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 2016-02-12
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多