所以我想用尽可能少的代码比较一个数组的三个成员。继承人我做了什么:
for(i in 0..2) {
if(board[i][0] == board[i][1] == board[i][2]) {
return true
} else if(board[0][i] == board[1][i] == board[2][i]) {
return true
}
}
(所有值都是Char的FYI)但它没有用。我收到此错误消息“运算符'=='不能应用于'布尔'和'字符'”。我也试过使用.equals,但那只是没有用。关于该怎么做的任何想法?
答案 0 :(得分:4)
你可以编写一个小函数来保持它的可读性和整洁性,特别是如果你需要经常进行这种比较:
fun allEqual(vararg items: Any) : Boolean {
for(i in 1..(items.size-1)){
if(items[0] != items[i]) return false
}
return true
}
只需用逗号分隔值调用:
allEqual(board[i][0], board[i][1], board[i][2])
答案 1 :(得分:3)
我不知道Kotlin,但大多数*语言不允许您同时比较3个值。您的错误消息正在传达的是您的代码最终会比较
“棋盘[i] [0]是否等于棋盘[i] [1]?”这是真/假(布尔)
到
board [i] [2],这是一个Char。
*我不知道有什么,但也许那里有一个。
答案 2 :(得分:0)
您已包含此条件:
if(board[i][0] == board[i][1] == board[i][2])
首先,比较这个:board[i][1] == board[i][2]
比较后,它返回true
。之后,如果逻辑转换为:
if(board[i][0] == true)
现在,board[i][0]
是一个char
,你试图将它与一个不可能的布尔值进行比较。这就是你得到这个错误的原因。
您必须将逻辑更改为:
if((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]))
所以,你的代码将是:
for(i in 0..2) {
if((board[i][0] == board[i][1]) && (board[i][1] == board[i][2])) {
return true
} else if((board[0][i] == board[1][i]) && (board[1][i] == board[2][i])) {
return true
}
}
答案 3 :(得分:0)
另一种方法:
for (i in 0..2) {
if (board[i].toSet().size == 1)
return true
else if (board.map { it[i] }.toSet().size == 1)
return true
}
答案 4 :(得分:0)
正如其他人所说,你的第一个比较返回布尔值,第二个比较布尔值与Char。
您可以使用扩展功能和传递性来简化事情:
fun Any.equalsAll(vararg others: Any):Boolean
{
others.forEach {
if(it!=this)
return false
}
return true
}
并致电:
if (board[0][i].equalsAll(board[1][i], board[2][i]))