运算符“==”不能应用于 'Boolean' 和 'Char'
Operator '==' cant be applied to 'Boolean' and 'Char'
所以我想用尽可能少的代码比较一个数组的三个成员。这是我所做的:
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)但是它没有用。我收到此错误消息 "Operator '==' cant be applied to 'Boolean' and 'Char'"。我也尝试过使用 .equals,但没有用。有什么想法吗?
我不是特别了解 Kotlin,但大多数*语言不允许您同时比较 3 个值。您的错误消息传达的是您的代码最终比较
"Is board[i][0] equal to board[i][1]?" 即 true/false(布尔值)
至
board[i][2],这是一个字符。
*我不知道有没有,但也许有一个。
您已包含此条件:
if(board[i][0] == board[i][1] == board[i][2])
首先比较这个:board[i][1] == board[i][2]
比较后returnstrue
。之后如果逻辑转换为:
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
}
}
您可以编写一个小函数以使其更具可读性和整洁性,尤其是当您需要经常进行比较时:
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])
另一种方法:
for (i in 0..2) {
if (board[i].toSet().size == 1)
return true
else if (board.map { it[i] }.toSet().size == 1)
return true
}
正如其他人所说,你第一次比较returns Boolean,第二次比较Boolean和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]))
所以我想用尽可能少的代码比较一个数组的三个成员。这是我所做的:
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)但是它没有用。我收到此错误消息 "Operator '==' cant be applied to 'Boolean' and 'Char'"。我也尝试过使用 .equals,但没有用。有什么想法吗?
我不是特别了解 Kotlin,但大多数*语言不允许您同时比较 3 个值。您的错误消息传达的是您的代码最终比较
"Is board[i][0] equal to board[i][1]?" 即 true/false(布尔值)
至
board[i][2],这是一个字符。
*我不知道有没有,但也许有一个。
您已包含此条件:
if(board[i][0] == board[i][1] == board[i][2])
首先比较这个:board[i][1] == board[i][2]
比较后returnstrue
。之后如果逻辑转换为:
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
}
}
您可以编写一个小函数以使其更具可读性和整洁性,尤其是当您需要经常进行比较时:
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])
另一种方法:
for (i in 0..2) {
if (board[i].toSet().size == 1)
return true
else if (board.map { it[i] }.toSet().size == 1)
return true
}
正如其他人所说,你第一次比较returns Boolean,第二次比较Boolean和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]))