运算符'=='不能应用于'布尔'和'字符'

时间:2018-06-08 22:27:46

标签: kotlin char boolean operators

所以我想用尽可能少的代码比较一个数组的三个成员。继承人我做了什么:

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,但那只是没有用。关于该怎么做的任何想法?

5 个答案:

答案 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]))