运算符“==”不能应用于 '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]))