从Facebook Hacker Cup's 2016 中的文件中读取星星Boomerang Constelations 问题,可以定义如下扩展函数:
fun BufferedReader.readStars(n: Int): Set<Star> {
return Array(n) {
val (l1, l2) = readLine().split(" ").map { it.toInt() }
Star(l1, l2)
}.toHashSet()
}
代码是紧凑的,但值首先被读入数组,然后转换为 HashSet
。有没有办法直接初始化一个 n
大小的 HashSet
和 Kotlin 中的初始化函数?
更新:标准 Kotlin 库中有现有方法吗?
最佳答案
您总是可以使用 apply
就地初始化对象:
HashSet<Star>(n).apply {
repeat(n) {
val (l1, l2) = readLine()!!.split(' ').map { it.toInt() }
put(Star(l1, l2))
}
}
如果每次都打字太不方便,写一个扩展函数:
inline fun <T> createHashSet(n : Int, crossinline fn: (Int) -> T) = HashSet<T>(n).apply {
repeat(n) { add(fn(it)) }
}
用法:
createHashSet<Star>(n) {
val (l1, l2) = readLine()!!.split(' ').map { it.toInt() }
Star(l1, l2)
}
关于kotlin - 有没有办法在 Kotlin 中构造带有初始化函数的 HashSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738702/