如何使用序列从字符串中生成所有子字符串?

How to yield all substrings from string using sequence?

我正在尝试学习 Kotlin 中的 Sequence

假设我想用 yield 语句得到一个字符串的所有子字符串的序列。我了解如何使用左右边框的两个嵌套循环来执行此操作。

在我看来,有一种有效的方法可以使用序列或一对嵌套序列而不是循环。但是我不知道该怎么做。

如何使用序列从字符串中生成所有子字符串? 谢谢

老实说,我不知道什么是最有效的方法。我只会使用 for 循环。但这是我对这个问题的解决方案,也许它会帮助你理解序列和这种编写代码的风格:

这里是 Playground

fun String.substrings() =
        indices.asSequence().flatMap { left ->
            (left + 1..length).asSequence().map { right -> substring(left, right) }
        }

序列不是特别有效,每个序列都涉及大量开销 - 它们的主要优势是能够一次通过整个操作链传递每个元素。

这意味着您不必为每个中间步骤创建一个全新的元素集合(较低的内存使用率),您可以在找到所需结果后提前终止,并且序列可以是无限的.即便如此,它们仍可能比普通列表版本慢,具体取决于您使用的是什么。

高效 序列可能是您正在做的,使用几个 for 循环和 yielding 项目。但是,如果您的意思是“高效”,例如“使用标准库而不是写出循环”,那么@Furetur 的答案是一种方法,或者您可以像这样使用滑动 windows:

val stuff = "12345"
val substrings = with(stuff) {
    indices.asSequence().flatMap { i ->
        windowedSequence(length - i)
    }    
}
print(substrings.toList())

>>>>[12345, 1234, 2345, 123, 234, 345, 12, 23, 34, 45, 1, 2, 3, 4, 5]

基本上只是对每个可能的子字符串长度使用 windowed(默认为 partialWindows=false),从 length1,使用所有内容的序列版本