#kotlin
#kotlin
Вопрос:
Как ни странно, я получал следующее сообщение об ошибке в Kotlin при работе со списком в другой функции:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 7 out of bounds for length 7
at java.base/java.util.Arrays$ArrayList.get(Arrays.java:4164)
at MainKt.findNumIndex(main.kt:19)
at MainKt.main(main.kt:9)
at MainKt.main(main.kt)
Код, над которым я работал, был следующим:
fun main() {
val list = listOf<Int>(3, 2, 5, 1, 5, 6, 7)
println("The list looks like the following: $list")
println("Search for this number:")
var searchNum = readLine()?.toInt()
if(searchNum != null) {
val index = findNumIndex(list, searchNum)
println("The index of $searchNum is $index")
}
}
fun findNumIndex(list: List<Int>, searchNum: Int): Int {
var indexPosition: Int = 0
for(i in list) {
if(list[i] == searchNum) {
indexPosition = i
} else {
indexPosition = -1
}
}
return indexPosition
}
По сути, я работал над программой, в которой вы указываете число, индекс которого хотите найти из списка
Комментарии:
1. Списки индексируются, начиная с 0. Ваш список из 7 элементов индексируется от 0 до 6, индекса 7 нет
2. С этой строкой
for(i in list)
вы не получите индекс. Вы получаете элемент.3. Ооо, так ты имеешь в виду, что « for (i в списке) « дает мне значение, а не номер индекса?
4. ДА. Вы также можете просто использовать list.forEach
Ответ №1:
В общем, лучше избегать подсчета индексов списка вручную, если это возможно, чтобы избежать однократных и других легко вводимых ошибок.
В Kotlin есть много полезных функций для выполнения подобных действий, в том числе одна, которая делает именно то, что вы хотите: indexOf
:
val index = list.indexOf(searchNum)
Чтобы ответить на ваш актуальный вопрос, если вы хотите вручную перебирать индексы, а не элементы, вы можете использовать for(i in list.indices)
. Вы также должны вернуться, как только найдете индекс, в противном случае вы продолжите цикл после того, как найдете его, и в конечном итоге -1
все равно вернетесь:
fun findNumIndex(list: List<Int>, searchNum: Int): Int {
for(i in list.indices) {
if(list[i] == searchNum) {
return i
}
}
return -1
}
Комментарии:
1. Хорошо, спасибо, я попробую
Ответ №2:
Проблема здесь:
for(i in list) {
if(list[i] == searchNum) {
i
это элемент списка, а не текущий индекс. В конце концов вы считываете последнее значение (которое равно 7) и выходите за пределы. Если вы поставите, скажем, 100
в начале, как:
val list = listOf<Int>(100, 3, 2, 5, 1, 5, 6, 7)
Вы получите Index 100 out of bounds for length 8
.
Для перебора коллекции с индексами вам нужно:
for((index, value) in someCollection.withIndex()) {
// do something
}