Kotlin用前面两个索引的元素压缩每个元素

时间:2019-10-23 15:49:21

标签: kotlin

我有一个(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)]

3 个答案:

答案 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()