您的任务是实现indexOfMax()函数,以便它返回 数组中最大元素的索引,如果数组为空,则返回null。
package maxindex
import kotlin.collections.*
fun indexOfMax(a: IntArray): Int? {
if (a.isNotEmpty()) {
var maxValue = a.max()
return a.indexOf(maxValue) // Type mismatch
} else {
return null
}
}
答案 0 :(得分:1)
我记得当我第一次开始使用Kotlin时,我很困惑,当它说"这个变量是可变的,所以不允许安全铸造"我不知道发生了什么:)
无论如何,由于该语言已输入可为空性,因此您的类型不匹配。因此,您无法可能将null
提供给indexOf
,因为它要求它为非空Int
。
如果您查看max()
的源代码:
public fun IntArray.max(): Int? {
if (isEmpty()) return null
....
所以可以给你null
,因此你得到了
val maxValue: Int? = a.max()
您无法提供maxValue
作为indexOf
的参数,因为它需要Int
,而不是Int?
。
因此,解决方案是明确处理null
案例:
return maxValue?.let { a.indexOf(it) } ?: null
但是现在,基于我们所知道的,你可以大大减少这样的代码行:
fun indexOfMax(a: IntArray): Int? = a.max()?.let { a.indexOf(it) }
您以后可以转变为扩展功能:
fun IntArray.indexOfMax(): Int? = max()?.let { indexOf(it) }
祝你在Kotlin旅途中好运。我个人认为Koans非常恼火,我更喜欢将Java代码转换为Kotlin,以了解学习初步语法怪癖的感受。
答案 1 :(得分:1)
a.max()
为空时, null
才会返回a
。因此,在if (a.isNotEmpty())
内,它永远不会为空,a.indexOf(maxValue)
采用非空Int
。
所以这段代码没问题,但Kotlin的类型系统无法表达“a.max()
永不返回null
如果a
不为空”并且不跟踪数组空虚它跟踪可空性的方式相同。所以你需要处理maxValue == null
案例,即使它实际上不会发生。