如何使用序列从字符串中生成所有子字符串?
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
循环和 yield
ing 项目。但是,如果您的意思是“高效”,例如“使用标准库而不是写出循环”,那么@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
),从 length
到 1
,使用所有内容的序列版本
我正在尝试学习 Kotlin 中的 Sequence
。
假设我想用 yield 语句得到一个字符串的所有子字符串的序列。我了解如何使用左右边框的两个嵌套循环来执行此操作。
在我看来,有一种有效的方法可以使用序列或一对嵌套序列而不是循环。但是我不知道该怎么做。
如何使用序列从字符串中生成所有子字符串? 谢谢
老实说,我不知道什么是最有效的方法。我只会使用 for 循环。但这是我对这个问题的解决方案,也许它会帮助你理解序列和这种编写代码的风格:
这里是 Playground
fun String.substrings() =
indices.asSequence().flatMap { left ->
(left + 1..length).asSequence().map { right -> substring(left, right) }
}
序列不是特别有效,每个序列都涉及大量开销 - 它们的主要优势是能够一次通过整个操作链传递每个元素。
这意味着您不必为每个中间步骤创建一个全新的元素集合(较低的内存使用率),您可以在找到所需结果后提前终止,并且序列可以是无限的.即便如此,它们仍可能比普通列表版本慢,具体取决于您使用的是什么。
最高效 序列可能是您正在做的,使用几个 for
循环和 yield
ing 项目。但是,如果您的意思是“高效”,例如“使用标准库而不是写出循环”,那么@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
),从 length
到 1
,使用所有内容的序列版本