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