Kotlin:自定义顺序的迭代器

Mor*_*roß 3 optimization intersection set hashset kotlin

我需要按自定义顺序(即基数升序)迭代集合列表。Kotlin 中可以创建自定义顺序的迭代器吗?

mad*_*ead 5

当然有可能。自 Java 以来,在 Kotlin 中创建自定义迭代器是可能的。您可以将此代码作为基础:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印:

[]
[2]
[1, 2]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

在这里问自己的更好的问题是:为什么需要迭代器而不是sortedBy直接在需要的地方对集合进行排序?