Kotlin:最佳列表合并技术?
Kotlin列表操作/合并问题:
所以我得到了一个(可变的)对的列表,看起来像这样
... Pair(IDENTIFIER, “A”), Pair(TICKTICK, “``”), Pair(IDENTIFIER, "_B") ...
我需要遍历列表并结束合并到这个:
... Pair(IDENTIFER, "A_B") ...
所以基本上找到所有TICKTICK
标记出现并合并前两个标记(即创建一个新的字符串加在一起)。
我目前的想法是做一个外观寻找TICKTICK
令牌,然后删除以前,当前和下一个,然后插入一个新合并的标记。
似乎应该有一个更自然的方式…。 任何想法 ?
这似乎也没有访问iteraror().previous
即使由此链接指示
使用Kotlin 1.2,您也可以使用新的windowed
stdlib函数来表示元素作为滑动窗口的快照,例如
println(listOf(1, 2, 3, 4, 5, 6).windowed(3)) // [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
然后检查窗口上的模式IDENTIFIER, TICKTICK, IDENTIFIER
,如果匹配(如果三个项目还没有被替换),那么将单个项目的信息存储在这些索引中。
val pattern = listOf(IDENTIFIER, TICKTICK, IDENTIFIER) // Stores indices of items that are not replaced: val indicesOfNormalItems = items.indices.toMutableSet()
窗口上的循环也会将结果项目收集到具有三元组第一个索引键的映射中:
val replaced = items.withIndex().windowed(pattern.size) { window -> val kinds = window.map { (_, item) -> item.first } if (kinds == pattern) { val windowFirstIndex = window.first().index if (windowFirstIndex in indicesOfNormalItems) { indicesOfNormalItems.removeAll(window.map { it.index }) val (first, _, third) = window.map { it.value.second } return@windowed windowFirstIndex to (IDENTIFIER to first + third) } } null }.filterNotNull().toMap()
然后收集结果,结合未更换的项目和地图中的值:
val result = items.indices.mapNotNull { index -> if (index in indicesOfNormalItems) items[index] else replaced[index] }
这是一个完整的可运行演示:( 链接)
在Kotlin 1.1.x中没有windowed
函数,所以你必须自己实现它,或者对你的代码进行相同的操作。