【问题标题】:Kotlin: Iterator in custom orderKotlin:自定义顺序的迭代器
【发布时间】:2020-06-25 10:58:28
【问题描述】:

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

【问题讨论】:

    标签: kotlin optimization set intersection hashset


    【解决方案1】:

    当然可以。在 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 对集合进行排序?

    【讨论】:

    • 我想计算一组集合的交集。由于集合不需要在列表中,我认为用迭代器解决它比用集合填充新列表要快。也许那只是想多了。
    • 无论如何,您的迭代器都将得到该集合集合的支持。
    【解决方案2】:

    我认为这是可能的,但由于在(原则上)一个轻量级的交互器抽象内部必须完成多少内部工作,这是非常不希望的。

    不如创建一个扩展函数,它会为您提供一个根据内部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]
    

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 2013-02-17
      • 2023-04-06
      • 2015-02-04
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 2016-04-05
      相关资源
      最近更新 更多