【发布时间】:2020-06-25 10:58:28
【问题描述】:
我需要以自定义顺序遍历集合列表,即具有升序基数。在 Kotlin 中可以创建具有自定义顺序的迭代器吗?
【问题讨论】:
标签: kotlin optimization set intersection hashset
我需要以自定义顺序遍历集合列表,即具有升序基数。在 Kotlin 中可以创建具有自定义顺序的迭代器吗?
【问题讨论】:
标签: kotlin optimization set intersection hashset
当然可以。在 Kotlin 中创建自定义迭代器是可能的,因为... Java。您可以将此代码作为基础:
class ListOfSets<E, S : Set<E>>(val from: List<S>) : Iterable<S> {
override fun iterator(): Iterator<S> {
return object : Iterator<S> {
val state = from.sortedBy { it.size }
var i = 0;
override fun hasNext(): Boolean = i < state.size
override fun next(): S = state[i++]
}
}
}
fun main() {
val sets = ListOfSets(
listOf(
setOf(1, 2, 3),
emptySet(),
setOf(1, 2, 3, 4),
setOf(1, 2),
setOf(1, 2, 1),
setOf(2, 2, 2, 2, 2)
)
)
for (set in sets) {
println(set)
}
}
打印出来:
[]
[2]
[1, 2]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
在这里问自己一个更好的问题是:为什么需要迭代器而不是直接在需要的地方使用sortedBy 对集合进行排序?
【讨论】:
我认为这是可能的,但由于在(原则上)一个轻量级的交互器抽象内部必须完成多少内部工作,这是非常不希望的。
不如创建一个扩展函数,它会为您提供一个根据内部Sets 大小排序的包装器列表,而不是?
private fun <T> ArrayList<Set<T>>.sortedOnSizes(): List<Set<T>> = sortedBy {
it.size
}
fun main() {
val sets = ArrayList<Set<Int>>()
sets.add(HashSet(setOf(1, 2, 3)))
sets.add(HashSet(setOf(3)))
sets.add(HashSet(setOf(1, 2, 3, 4, 5)))
sets.sortedOnSizes().forEach(::println)
}
打印出来:
[3] [1, 2, 3] [1, 2, 3, 4, 5]
【讨论】: