首页 > 解决方案 > Kotlin:自定义顺序的迭代器

问题描述

我需要以自定义顺序(即递增基数)遍历集合列表。可以在 Kotlin 中创建具有自定义顺序的迭代器吗?

标签: kotlinoptimizationsetintersectionhashset

解决方案


当然有可能。在 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直接在需要的地方对集合进行排序?


推荐阅读