如何定义已排序的Kotlin序列

如何定义已排序的Kotlin序列,kotlin,Kotlin,有没有办法在Kotlin中设置序列的状态来告诉它数据是有序的 我知道我可以创建Kotlin序列,如下所示: generateSequence(0) { it + 1 }.windowed(size = 100, step = 1) 我认为,如果已知序列是有序的,那么这个序列上的一些操作会更有效。例如,distinct()。如果顺序不正确,则需要使用临时存储。有没有办法生成这个序列并告诉Kotlin我们知道数据已经被排序了?因为序列是惰性的,并且可能是无限的,所以除了序列排序之外,任何排序的概念

有没有办法在Kotlin中设置
序列的状态来告诉它数据是有序的

我知道我可以创建Kotlin
序列
,如下所示:

generateSequence(0) { it + 1 }.windowed(size = 100, step = 1)

我认为,如果已知序列是有序的,那么这个序列上的一些操作会更有效。例如,
distinct()
。如果顺序不正确,则需要使用临时存储。有没有办法生成这个序列并告诉Kotlin我们知道数据已经被排序了?

因为序列是惰性的,并且可能是无限的,所以除了序列排序之外,任何排序的概念都很难处理。迭代时,您如何知道已找到下一个(最大)值?
也就是说,“排序(无限)序列”是否是一个定义良好的概念还不清楚,更不用说有用的概念了(在编程库的上下文中;在数学中,这当然很好!)

根据计划对结果集合执行的操作,可以使用排序集:

generateSequence(0) { it + 1 }.windowed(size = 100, step = 1).
        toSortedSet(Comparator { o1, o2 -> o1.sum() - o2.sum() })
您定义了一系列列表,但实际上并不清楚如何对这些列表进行排序

注意事项:

  • 不再懒惰
  • 不允许复制;Kotlin库似乎缺少多集(或包,或计数集,或…)实现。通过与计数器成对组合值,易于模拟
  • 有些操作比没有顺序保证的线性序列更昂贵

  • 不,科特林没有有序序列的概念。嗯,这很不幸。在许多情况下,序列操作将更有效地依赖于这些知识。我想,在查看代码now()时,它似乎总是假定无序。我同意,将其添加到语言中是一件好事。同时,我想添加一个
    接口OrderedSequence:Sequence
    并自己定义所需的操作是你最好的选择(除非你找到一个已经为你这样做的库),我不同意。Java流是类似的,但可以有一个与之关联的属性,表示数据是有序的或排序的,以及其他属性。如果一个对象序列被标记为有序,则可以知道,当您在序列中迭代时,相等的对象彼此相邻,这意味着您只需要存储看到的最后一个对象,就可以生成一个不同的对象序列。是的,您依赖的是序列上的标记是准确的这一事实,但您可以使用Java Streams来实现这一点。这里的工作是简单地跟踪在序列上迭代时最后看到的内容。@Mike-Hmm,我在考虑如何将任意序列/流转换为有序序列/流。这是一个不同(而且更难)的问题;当然,我们可以断言给定的流是有序的,并动态地检查这个断言。