Оператор '==' не может быть применен к 'Boolean' и 'Char' - PullRequest
0 голосов
/ 09 июня 2018

Итак, я хочу сравнить три члена массива с как можно меньшим количеством кода.Вот что я сделал:

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
    }
}

(все значения, к сожалению, Чар), но это не сработало.Я получаю это сообщение об ошибке «Оператор ==» не может быть применен к «Boolean» и «Char».Я также пытался использовать .equals, но это просто не сработало.Есть идеи, что делать?

Ответы [ 5 ]

0 голосов
/ 09 июня 2018

Как говорили другие, ваше первое сравнение возвращает 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]))
0 голосов
/ 09 июня 2018

Другой подход:

for (i in 0..2) {
    if (board[i].toSet().size == 1)
        return true
    else if (board.map { it[i] }.toSet().size == 1)
        return true
}
0 голосов
/ 09 июня 2018

Вы включили это условие:

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
    }
}
0 голосов
/ 09 июня 2018

Вы можете написать небольшую функцию, чтобы сделать ее более читабельной и аккуратной, особенно если вам нужно часто выполнять такое сравнение:

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])
0 голосов
/ 09 июня 2018

Я не знаю конкретно Kotlin, но большинство * языков не позволяют сравнивать 3 значения одновременно.Ваше сообщение об ошибке сообщает о том, что ваш код в итоге сравнивает

"Является ли board [i] [0] равным board [i] [1]?"который является истинным / ложным (логическим)

до

доска [i] [2], который является Char.

* Я не знаю ни одного, номожет быть, есть кто-то, кто это делает.

...