Kotlin: обработка исключений в рекурсии - PullRequest
0 голосов
/ 29 апреля 2020

Вот моя функция:

fun quickSort(data: List<PhEntry>, maxTime: Long = 0L): List<PhEntry> {
    if (System.currentTimeMillis() > maxTime) throw Exception("")
    if (data.size < 2) return data
    val pivot = data[data.lastIndex / 2]
    val equal = data.filter { it.name == pivot.name }
    val greater = data.filter { it.name > pivot.name }
    val lesser = data.filter { it.name < pivot.name }
    return quickSort(lesser, maxTime) + equal + quickSort(greater, maxTime)
}

Я вызываю это из функции учета времени:

fun sortTimer(data: List<PhEntry>, time: Long = 0L, sortFunc: (sortedData: List<PhEntry>, time: Long) -> List<PhEntry>): Pair<List<PhEntry>?, Long> {
    val startTime = System.currentTimeMillis()
    return try{
        val result = sortFunc(data, startTime + time)
        Pair(result, System.currentTimeMillis() - startTime)
    } catch (e: Exception) {
        Pair(null, System.currentTimeMillis() - startTime)
    }
}

Данные - это огромный телефонный справочник, содержащий миллион записей. Предполагается, что программа попытается отсортировать весь список в течение 90 секунд. Если это невозможно, то для простого поиска по несортированному списку следует go.

Значения времени 90000L (90 секунд) или более приводят к зависанию программы. Он не бросает никаких исключений, просто зависает. Я просто попытался использовать 1000L в качестве значения для time, и программа работает нормально.

Почему это происходит? Я хочу в основном прекратить рекурсию, если будет достигнут срок. Я не могу использовать библиотеки kotlinx, так как я делаю курс из HyperSkill, и они не позволяют мне изменять файл Gradle.


Редактировать 1:

При вставке println(System.currentTimeMillis()) в функции quickSort, функция останавливается, когда System.currentTimeMillis() превышает maxTime. И тогда ничего не происходит. На этом этапе рекурсия очень глубокая, в этом причина такого поведения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...