Kotlin 参加科特林的一个序列
我正在尝试部分使用Kotlin中的一个序列,以便将其拆分Kotlin 参加科特林的一个序列,kotlin,sequence,Kotlin,Sequence,我正在尝试部分使用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] 但我想要的是
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函数,但它返回的序列只能迭代一次。关键是对每个迭代使用相同的迭代器
// 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()) // []
}
迭代器有asSequence函数,但它返回的序列只能迭代一次。关键是对每个迭代使用相同的迭代器
// 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())
可以从原始序列创建两个子序列:
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())
}
我发现我们可以使用迭代器来实现这一点:
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())
}
不是一个优雅的解决方案seq.withIndex.groupBy{it.index<4}{it.value}.Values不是一个优雅的解决方案seq.withIndex.groupBy{it.index<4}{it.value}.Values如果您已经开始使用列表/iterable,最好直接使用分区函数。为什么要创造sequence@sidgate使用列表进行演示。实际上,我使用的是一个XML解析器。如果您已经开始使用list/iterable,那么最好直接使用分区函数。为什么要创造sequence@sidgate使用列表进行演示。实际上,我使用的是XML解析器。