gpt4 book ai didi

kotlin - 将列表分成两个列表

转载 作者:行者123 更新时间:2023-12-02 17:57:40 25 4
gpt4 key购买 nike

是否有一种简单的方法可以将 Double 列表分成 Kotlin 中的两个对列表?

这样:

[x1, y1, x2, y2, x3, y3] => [(x1, x2), (x2, x3), (x3, x1)], [(y1, y2), (y2, y3), (y3, y1)] 

我尝试使用filterIndexedzipWithNext

val x = filterIndexed { index, _ -> index % 2 == 0 }.zipWithNext()
val y = filterIndexed { index, _ -> index % 2 == 1 }.zipWithNext()

但结果是:

[x1, y1, x2, y2, x3, y3] => [(x1, x2), (x2, x3)], [(y1, y2), (y2, y3)] 

最佳答案

如果我理解正确,您使用的 zipWithNext 的问题是它没有“环绕”,即输出最终的 (x3, x1) 或 (y3, y1)对,包含列表的最后一个和第一个元素。

您只需声明您自己的 zipWithNext 版本即可解决此问题。

你可以这样做:

fun <T> Iterable<T>.zipWithNextAndWrapAround(): List<Pair<T, T>> {
val zippedWithNext = zipWithNext()
if (zippedWithNext.isEmpty()) return zippedWithNext
return zippedWithNext + (zippedWithNext.last().second to zippedWithNext.first().first)
}

或者复制并粘贴 zipWithNext 的原始源代码并稍微修改一下:

fun <T> Iterable<T>.zipWithNextAndWrapAround(): List<Pair<T, T>> {
val iterator = iterator()
if (!iterator.hasNext()) return emptyList()
val result = mutableListOf<Pair<T, T>>()
var current = iterator.next()

// remember what the first element was
val first = current
while (iterator.hasNext()) {
val next = iterator.next()
result.add(current to next)
current = next
}

// at last, add this pair
result.add(current to first)
return result
}

用法:

val x = list.filterIndexed { index, _ -> index % 2 == 0 }.zipWithNextAndWrapAround()
val y = list.filterIndexed { index, _ -> index % 2 == 1 }.zipWithNextAndWrapAround()

请注意,这会循环列表两次。您可以通过编写自己的 partition 版本来避免这种情况称为partitionIndexed

代码可能类似于:

inline fun <T> Iterable<T>.partitionIndexed(predicate: (Int, T) -> Boolean): Pair<List<T>, List<T>> {
val first = ArrayList<T>()
val second = ArrayList<T>()
forEachIndexed { index, element ->
if (predicate(index, element)) {
first.add(element)
} else {
second.add(element)
}
}
return Pair(first, second)
}

// usage:
val (x, y) = list.partitionIndexed { index, _ ->
index % 2 == 0
}.let { (a, b) ->
a.zipWithNextAndWrapAround() to b.zipWithNextAndWrapAround()
}

关于kotlin - 将列表分成两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75334955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com