当前位置:  开发笔记 > 开放平台 > 正文

有没有办法在Kotlin中用initializator函数构造HashSet?

如何解决《有没有办法在Kotlin中用initializator函数构造HashSet?》经验,为你挑选了2个好方法。

要阅读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库中是否存在现有方法?



1> Kirill Rakhm..:

您始终可以使用它apply来就地初始化对象:

HashSet(n).apply {
    repeat(n) {
        val (l1, l2) = readLine()!!.split(' ').map { it.toInt() }
        put(Star(l1, l2))
    }
}

如果每次都太不方便,请写一个扩展功能:

inline fun  createHashSet(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)
}



2> miensol..:

因为HashSet是一个java类所以你只能用JDK提供的方式初始化它.

虽然在Kotlin运行时没有辅助方法,但是很容易自己编写它:

public fun  hashSetOf(size: Int, initializer: (Int) -> T): HashSet {
    val result = HashSet(size)
    0.rangeTo(size - 1).forEach {
        result.add(initializer(it))
    }
    return result
}

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有