// 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如果一包卡(一个包包含十张卡,每张卡随机创建(每个卡对象有一个卡号的字段并且适合它属于),因此有可能重复卡)
此外,我正在编写一个返回重复卡的方法,但必须先完成此操作。
答案 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集合。