如果ArrayList包含重复项,则返回true?然后返回重复卡?

时间:2014-01-15 13:53:34

标签: java eclipse object arraylist return

// Return true if there is a duplicate card in the pack
public boolean hasDuplicate() {
    ArrayList<Card> nondoop = new ArrayList<Card>();        
    for (Card c : pack) {
        if (nondoop.contains(c)) {
            return true;
        }
        nondoop.add(c);
    }       
    return false;       
}

这是我的Java代码,我不明白为什么它不起作用?它总是返回假。基本上这个方法需要返回true如果一包卡(一个包包含十张卡,每张卡随机创建(每个卡对象有一个卡号的字段并且适合它属于),因此有可能重复卡)

此外,我正在编写一个返回重复卡的方法,但必须先完成此操作。

4 个答案:

答案 0 :(得分:4)

 if (nondoop.contains(c)) {

这将检查c引用的对象是否包含在ArrayList中。如果您的包只包含不同的Card对象,则您的方法永远不会返回true。

问题是,您认为重复卡是什么?如果您的包中有一个Card对象多次,则代码可以正常工作,但如果您有不同的Card对象具有相同的内容(应该是相同的),则代码无效。

编辑:如果您想阻止代表同一张卡的不同Card对象进入ArrayList,您可以覆盖Card中的equals()方法(和hashCode())以使您的代码正常工作。

答案 1 :(得分:1)

Card实例与其他实例相等时,您必须定义第一个也是最重要的事情,所以在您的Card类中,您应该覆盖equals()并且不要违反合同{{ 1}}。

其次,您想要返回重复项,而是返回hashCode()值,因此您不知道重复项。

第三,我宁愿在util类中使它成为静态方法,因为你可以使用你想要的东西。

所以将代码更改为类似的内容。

boolean

请注意,订单无法保证。

答案 2 :(得分:0)

尝试使用此方法返回重复项:

public Card getDuplicate() {
    int pos = 0;
    boolean has = false;
    for (int i = 0; i < pack.size(); i++) {
        for (int i1 = i+1; i1 < pack.size(); i1++) {
            if (pack.get(i).getNumber() == pack.get(i1).getNumber() && pack.get(i).getSuit() == pack.get(i1).getSuit()) {
                pos= i ;
                has = true;
            }
        }
    }

    if (has == true) {
        return pack.get(pos);
    } else{
        return null;
    }
}   

答案 3 :(得分:-1)

扩展已经说过的内容,这里有一个可以使用的功能签名:

/ **如果卡片中有任何重复的卡片(相同的等级和套件),则返回true * /
public boolean hasDuplicate(List&lt; Card&gt; cards){
}

请注意,您仍然可以作为参数传递给ArrayList&lt;卡&gt;因为ArrayList实现了List。但是,您现在可以传入任何实现List的Java集合。