我必须编写一个程序,输入各种棋子,将它们添加到一个数组中,然后找到可能的重复...
答案 0 :(得分:0)
第一个问题:
当您添加第一个棋子时,i
为0,对吧?在内部for循环中,k
也从1开始,对吧?显然,chessboard[k]
和chessboard[i]
是相同的,因为k
和i
是相等的!
要解决此问题,只需添加i != k
条件:
for (int k=0; k<chessboard.length ; k++){
// note the condition here
if (k != i && chessboard[k] == (chessboard[i]) && chessboard[k] == null){
JOptionPane.showMessageDialog(null, "Error! There is a duplicate piece on the chessboard: "+chessboard[k]);
System.exit(0);
}
}
break;
}
第二个问题:
==
比较两个操作数是否是相同的对象。即使两个棋子对象具有相同的颜色,类型和位置,它们仍然可以是两个独立的对象。你真正需要的是一种逻辑比较棋子对象的方法(当两个棋子的位置相等时,它们是相等的。)
为此,只需向equals
添加Piece
方法即可。这是一个简单的实现:
@Override
public boolean equals(Object obj) {
if (obj instance of Piece) {
Piece other = (Piece)obj;
return other.position.equals(this.position);
} else {
return false;
}
}
然后,您可以调用此方法,而不是使用==
。
第三个问题:
这不是一个真正的问题,但我建议您将数组的类型更改为Piece[]
而不是Object[]
,除非您想在其中存储棋子以外的其他内容。
答案 1 :(得分:-1)
等于运算符==
比较引用而不是实际内容。
你想要的是覆盖equals()
方法并比较它自己的每个变量。不要忘记这对于字符串也是如此,因为String
是引用类型。您可以比较字符串:
str1 = "first string";
str2 = "second string";
if(str1.equals(str2)){
statements;
}