Итерация двухмерного массива в Котлине - PullRequest
0 голосов
/ 30 июня 2019

У меня возникли проблемы с итерацией моего массива логических значений. Проблема в том, что у меня есть четыре позиции, которые должны активировать мое условие if, но оно обнаруживает только одну. Я думаю, это потому, что я перебираю мысли в плохом смысле. Вот мой код, чтобы вы могли понять мою проблему:

Декларация массивов:

  var columns = BooleanArray(Constants.WIDTH){ false }
    var lines = BooleanArray(Constants.HEIGHT){false}

Здесь я проверяю только то, в каких положениях я должен включить истинное состояние, и, как вы можете видеть, я углубляюсь в матрицу:

fun addNewIPiece(positionX:Int,positionY:Int){
        val matrixPositionX = positionX/Constants.WIDTH_BLOCK
        val matrixPositionY = positionY/Constants.HEIGHT_BLOCK
        columns[matrixPositionX] = true
        for(i in 0..4){
            lines[matrixPositionY+i] = true
        }

    }

Здесь я перебираю и столбцы, и линии, и рисую некоторые блоки, но в некоторой степени получаю только одно совпадение (проверьте ниже кода):

fun drawMap(monoBlock: MonoBlock,canvas: Canvas){
        for(columnsList in columns ){
            for (linesList in lines){
                if (columnsList and linesList)  {
               Log.d("CoincidenceX",columns.indexOf(columnsList).toString())
                Log.d("CoincidenceY",lines.indexOf(linesList).toString())                        monoBlock.draw(canvas,columns.indexOf(columnsList),lines.indexOf(linesList))
                }

            }
        }
    }

А вот и отладка:

D/CoincidenceY: 87
D/CoincidenceX: 20
D/CoincidenceY: 87
D/CoincidenceX: 20
D/CoincidenceY: 87 ...........

Значит, кто-нибудь может понять, откуда появилась моя ошибка? Я думаю, это так, как я повторяю, но я не уверен.

Заранее спасибо, спросите, есть ли у вас вопрос.

1 Ответ

3 голосов
/ 30 июня 2019

Тип данных переменных columnsList и linesList (абсолютно неподходящие имена) - Boolean, который является примитивным типом данных, и они имеют значения true или false.Поэтому, когда вы используете indexOf(), он возвращает индекс первого элемента, который соответствует значению columnsList или linesList, а не индекс элемента, который вы в данный момент повторяете.Поскольку вас интересуют индексы, используйте индексированный цикл:

for (i in columns.indices) {
    for (j in lines.indices) {
        if (columns[i] && lines[j]) {
            Log.d("CoincidenceX", i.toString())
            Log.d("CoincidenceY", j.toString())
        }
    }
}
...