Как решить проблему выхода индекса 7 за пределы для длины 7 в Kotlin?

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