排序如何以懒惰的序列起作用



假设我正在使用懒惰的序列和一种无限序列,然后我尝试写类似(伪代码(的东西:

Sequence([1,2,3,...])
   .sortDescending()
   .take(10);

在这种情况下,我先进行排序,然后进行10元素。排序函数如何在无限序列上执行?

一个示例是kotlin序列:https://kotlinlang.org/api/latest/jvm/stdlib/stdlib/kotlin.sequences/sorted.html

sortDescending方法将相应的序列转换为MutableList,该序列正在排序,然后转换回新序列。以下显示了内部使用的sortedWith功能:

/**
 * Returns a sequence that yields elements of this sequence sorted according to the specified [comparator].
 * The operation is _intermediate_ and _stateful_.
 */
public fun <T> Sequence<T>.sortedWith(comparator: Comparator<in T>): Sequence<T> {
    return object : Sequence<T> {
        override fun iterator(): Iterator<T> {
            val sortedList = this@sortedWith.toMutableList()
            sortedList.sortWith(comparator)
            return sortedList.iterator()
        }
    }
}

因此,当您有无限序列时,例如:

generateSequence(1) {
    it * 2
}

您在该顺序上调用所描绘的函数(以及 terminate 函数 forEach { println(it) }(,所有元素在某个时候都会添加到列表中,由于一个肯定会因一个无限循环:

java.lang.OutOfMemoryError: Java heap space

您可能需要对固定数量的元素进行排序:

generateSequence(1) {
    it * 2
}.take(10)
 .sortedDescending()
 .forEach { println(it) }

相关内容

  • 没有找到相关文章

最新更新