Kotlin:自定义顺序的迭代器
Kotlin: Iterator in custom order
我需要按自定义顺序遍历集合列表,即使用升序基数。可以在 Kotlin 中创建具有自定义顺序的迭代器吗?
我认为这是可能的,但由于必须在(原则上)轻量级抽象的交互器中完成大量内部工作,因此非常不受欢迎。
如何创建一个扩展函数来为您提供一个根据内部 Set
大小排序的包装器列表?
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]
当然可以。在 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
对集合进行排序?
我需要按自定义顺序遍历集合列表,即使用升序基数。可以在 Kotlin 中创建具有自定义顺序的迭代器吗?
我认为这是可能的,但由于必须在(原则上)轻量级抽象的交互器中完成大量内部工作,因此非常不受欢迎。
如何创建一个扩展函数来为您提供一个根据内部 Set
大小排序的包装器列表?
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]
当然可以。在 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
对集合进行排序?