在 Kotlin 中参与一个序列
Take part of a sequence in Kotlin
我试图在 Kotlin 中部分使用一个序列,以便将其拆分。
fun main() {
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asSequence()
println(seq.take(4).toList().toString());
println(seq.toList().toString())
}
这输出:
[0, 1, 2, 3]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 90]
但我追求的是:
[0, 1, 2, 3]
[4, 5, 6, 7, 8, 90]
制作列表仅用于演示目的。因此,创建整个序列的列表并拆分列表并不是我想要的答案。
迭代器有asSequence()
函数,但是returns序列只能迭代一次。重点是每次迭代都使用相同的迭代器。
// I don't know how to name the function...
public fun <T> Iterable<T>.asIteratorSequence(): Sequence<T> {
val iterator = this.iterator()
return Sequence { iterator }
}
fun main() {
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asIteratorSequence()
println(seq.take(4).toList().toString()) // [0, 1, 2, 3]
println(seq.toList().toString()) // [4, 5, 6, 7, 8, 9]
println(seq.toList().toString()) // []
}
您可以从原始序列创建两个子序列:
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asSequence()
val firstCount = 4
val first = seq.take(firstCount)
val second = seq.drop(firstCount)
println(first.toList())
println(second.toList())
我发现我们可以为此使用迭代器:
fun main() {
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asSequence().iterator()
println(seq.asSequence().take(4).toList().toString());
println(seq.asSequence().toList().toString())
}
这样序列推进内部迭代器。如果序列最初是从一个Iterable
中得到的,就像上面的例子,我们可以进一步简化:
fun main() {
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).iterator()
println(seq.asSequence().take(4).toList().toString());
println(seq.asSequence().toList().toString())
}
我试图在 Kotlin 中部分使用一个序列,以便将其拆分。
fun main() {
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asSequence()
println(seq.take(4).toList().toString());
println(seq.toList().toString())
}
这输出:
[0, 1, 2, 3]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 90]
但我追求的是:
[0, 1, 2, 3]
[4, 5, 6, 7, 8, 90]
制作列表仅用于演示目的。因此,创建整个序列的列表并拆分列表并不是我想要的答案。
迭代器有asSequence()
函数,但是returns序列只能迭代一次。重点是每次迭代都使用相同的迭代器。
// I don't know how to name the function...
public fun <T> Iterable<T>.asIteratorSequence(): Sequence<T> {
val iterator = this.iterator()
return Sequence { iterator }
}
fun main() {
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asIteratorSequence()
println(seq.take(4).toList().toString()) // [0, 1, 2, 3]
println(seq.toList().toString()) // [4, 5, 6, 7, 8, 9]
println(seq.toList().toString()) // []
}
您可以从原始序列创建两个子序列:
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asSequence()
val firstCount = 4
val first = seq.take(firstCount)
val second = seq.drop(firstCount)
println(first.toList())
println(second.toList())
我发现我们可以为此使用迭代器:
fun main() {
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asSequence().iterator()
println(seq.asSequence().take(4).toList().toString());
println(seq.asSequence().toList().toString())
}
这样序列推进内部迭代器。如果序列最初是从一个Iterable
中得到的,就像上面的例子,我们可以进一步简化:
fun main() {
val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).iterator()
println(seq.asSequence().take(4).toList().toString());
println(seq.asSequence().toList().toString())
}