Второй массив не будет увеличиваться после повторения цикла for

#arrays #for-loop #if-statement #kotlin

#массивы #for-цикл #if-оператор #kotlin

Вопрос:

Я новичок в Kotlin и пытаюсь сравнить элементы двух массивов, увидев, какой массив имеет больший элемент. Массивы создаются с помощью пользовательского ввода. Ошибка, с которой я сталкиваюсь, заключается в том, что когда я повторяю второй цикл for (внутренний цикл), который содержит содержимое второго массива, он не будет увеличиваться до следующего элемента второго массива, в отличие от первого цикла for. Таким образом, если a = {1,2} и b = {2,1} , a будет увеличиваться как через 1, так и через 2, но b останется на уровне 2 в течение обеих итераций цикла. Вот моя функция, которая вызывает у меня проблему:

     fun practiceCompareArray(a: Array<Int>, b: Array<Int>): Array<Int> {
        var j: Array<Int>
        var aPoints = 0
        var bPoints = 0

        for (x:Int in a) {
--------->  for (y: Int in b) {
                if (x > y) {
                    aPoints  
                } else if (x < y) {
                    bPoints  
               break
            }
        }

        j = arrayOf(aPoints, bPoints)

        return j
    }
  

Цикл for со стрелкой вызывает у меня проблему. Я думаю, это из-за оператора break в конце внутреннего цикла. Нужен ли мне вообще внутренний цикл для сравнения каждого массива? Любая справка или документация были бы полезны.

Комментарии:

1. Вы хотите сравнить массивы поэлементно? Т.е. первые элементы обоих, затем вторые из обоих и т.д.? В таком случае взгляните на zip .

2. Это правильно. Первые элементы обоих, затем второй из обоих и т.д. Я посмотрю на zip и вернусь к вам позже!

Ответ №1:

Если вы знаете, что оба массива имеют одинаковую длину, и вы хотите сравнить их поэлементно, вы могли бы сделать что-то вроде:

 fun practiceCompareArray(a: Array<Int>, b: Array<Int>): Array<Int> {
    var aPoints = 0
    var bPoints = 0

    for ((x,y) in a.zip(b)) {
        if (x>y) {
            aPoints   
        } else {
            bPoints   
        }
    }
    return arrayOf(aPoints, bPoints)
}
  

или в более функциональном стиле

 fun practiceCompareArray(a: Array<Int>, b: Array<Int>): Array<Int> {
    val (aPoints, bPoints) = a.zip(b)
      .fold(Pair(0,0), {(aScore, bScore), (x,y) -> 
         if (x > y) Pair(aScore   1, bScore) else Pair(aScore, bScore   1)})

    return arrayOf(aPoints, bPoints)
}