要阅读Facebook Hacker Cup 2016 Boomerang Constelations问题中的文件星标,可以定义以下扩展功能:
fun BufferedReader.readStars(n: Int): Set{ return Array(n) { val (l1, l2) = readLine().split(" ").map { it.toInt() } Star(l1, l2) }.toHashSet() }
代码很紧凑,但首先将值读入数组,然后转换为a HashSet
.有没有办法在Kotlin中直接初始化a 和sizeizator函数HashSet
的大小n
?
更新:标准Kotlin库中是否存在现有方法?
您始终可以使用它apply
来就地初始化对象:
HashSet(n).apply { repeat(n) { val (l1, l2) = readLine()!!.split(' ').map { it.toInt() } put(Star(l1, l2)) } }
如果每次都太不方便,请写一个扩展功能:
inline funcreateHashSet(n : Int, crossinline fn: (Int) -> T) = HashSet (n).apply { repeat(n) { add(fn(it)) } }
用法:
createHashSet(n) { val (l1, l2) = readLine()!!.split(' ').map { it.toInt() } Star(l1, l2) }
因为HashSet
是一个java类所以你只能用JDK提供的方式初始化它.
虽然在Kotlin运行时没有辅助方法,但是很容易自己编写它:
public funhashSetOf(size: Int, initializer: (Int) -> T): HashSet { val result = HashSet (size) 0.rangeTo(size - 1).forEach { result.add(initializer(it)) } return result }