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 对集合进行排序?