kotlin - Kotlin:递归中的异常处理
问题描述
这是我的功能:
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 秒内对整个列表进行排序。如果不可能,那么它应该对未排序的列表进行简单的搜索。
时间值大于等于 90000L(90 秒)会导致程序冻结。它不会抛出任何异常,只是冻结。我刚刚尝试使用 1000L 作为值,time
并且程序运行良好。
为什么会这样?如果达到时间限制,我想基本上终止递归。我不能使用kotlinx
库,因为我正在从 hyperskill 上一门课程,而且它们不允许我修改 gradle 文件。
编辑1:
println(System.currentTimeMillis())
在函数中插入 a时quickSort
,函数会在System.currentTimeMillis()
超过时冻结maxTime
。然后什么也没有发生。此时递归非常深,这是导致这种行为的原因吗?
解决方案
推荐阅读
- twilio - 如果应用程序在本地运行,则在出站呼叫时在 StatusCallback 中设置什么
- laravel - Vuejs无限循环
- arrays - Google Sheets IF条件检查一列中的多个值是否存在于另一列中
- r - 如何将点添加到数字 - YYYYMM 到 YYYY.MM
- android - Flutter:如何让容器适合它的孩子
- python - 将 rugarch R 库导入 python
- javascript - 如何在 laravel 的多个选项卡中导出数据表?
- angular - 使用 api 在事件数组中添加新事件后,更新的完整日历事件未呈现
- delphi - Delphi - 如何将多个 JPG 图像添加到 TCanvas 并打印它们
- xpath - 如何使用 xpath 从类中获取文本