我有一个(e1, e2, e3, e4, e5...)
列表。我想用e1
压缩e3
,用e2
压缩e4
,依此类推。
我找不到一种压缩方法,该方法可以让您选择要使用当前元素压缩的元素。
items.map { item -> item.zipWithNext() }
[e1, e2, e3, e4, e5, e6, e7, e8] -> [(e1, e3), (e2, e4), (e5, e7), (e6, e8)]
答案 0 :(得分:2)
items.zipWithNext()
函数本质上是items.zip(items.drop(1))
的优化版本。
由于您需要将每个项目压缩到相距两个位置的项目,因此您可以使用
items.zip(items.drop(2))
:
val items = listOf("e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8")
println(items.zip(items.drop(2)))
// prints: [(e1, e3), (e2, e4), (e3, e5), (e4, e6), (e5, e7), (e6, e8)]
答案 1 :(得分:1)
为此要求,列表的大小必须为4的倍数,如下所示:
val list = mutableListOf("e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8")
因此,您首先要做的是交换位置 1 和 2 , 5 和 6 , 9 和 10 等:
for (i in 0..list.size / 4 - 1)
list[4 * i + 1] = list[4 * i + 2].also { list[4 * i + 2] = list[4 * i + 1] }
现在列表是这个:
[e1, e3, e2, e4, e5, e7, e6, e8]
最后使用chunked(2)
将列表分为2个连续项的列表:
val newList = list.chunked(2)
println(newList)
将打印:
[[e1, e3], [e2, e4], [e5, e7], [e6, e8]]
如果您的初始列表不可更改或希望保持不变,请创建一个新的可变列表并对其进行操作:
val originalList = listOf("e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8")
val list = originalList.toMutableList()
答案 2 :(得分:1)
您应该做一堆工作。
val items = listOf("e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8")
val partitionedItems = items.withIndex().partition { (index, _) -> index % 2 == 0 }
val oddList = partitionedItems.first.map { it.value }
val evenList = partitionedItems.second.map { it.value }
在这里,我们有这样的奇数和偶数列表:
[e1,e3,e5,e7]
[e2,e4,e6,e8]
下一步执行zipWithNext()
oddList.zipWithNext()
这会创建这样的数据
[((e1,e3),(e3,e5),(e5,e7)]
但我们不需要此项目:
(e3,e5)
因此我们应该对其进行过滤。
val oddListPair = oddList.zipWithNext().withIndex().filter { (index, _) -> index % 2 == 0 }.map { it.value }
最后我们有
[((e1,e3),(e5,e7)]
在最后一步,我们应该合并两个奇数和偶数列表。
oddListPair.zip(evenListPair){ a,b -> listOf(a,b)}.flatten()
完整的代码是这个。
val items = listOf("e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8")
val partitionedItems = items.withIndex().partition { (index, _) -> index % 2 == 0 }
val oddList = partitionedItems.first.map { it.value }
val evenList = partitionedItems.second.map { it.value }
val oddListPair = oddList.zipWithNext().withIndex().filter { (index, _) -> index % 2 == 0 }.map { it.value }
val evenListPair = evenList.zipWithNext().withIndex().filter { (index, _) -> index % 2 == 0 }.map { it.value }
oddListPair.zip(evenListPair){ a,b -> listOf(a,b)}.flatten()