Kotlin:最佳列表合并技术?

Kotlin列表操作/合并问题:

所以我得到了一个(可变的)对的列表,看起来像这样

... Pair(IDENTIFIER, “A”), Pair(TICKTICK, “``”), Pair(IDENTIFIER, "_B") ...

我需要遍历列表并结束合并到这个:

... Pair(IDENTIFER, "A_B") ...

所以基本上find所有TICKTICK标记出现并合并前两个标记(即创建一个新的字符串加在一起)。

我目前的想法是做一个外观寻找TICKTICK令牌,然后删除先前,当前和下一个,然后插入一个新合并的令牌。

似乎应该有一个更自然的方式…。 任何想法

这似乎也没有访问iteraror().previous即使由此链接指示

One Solution collect form web for “Kotlin:最佳列表合并技术?”

使用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函数,所以你必须自己实现它,或者对你的代码进行相同的操作。

  • Kotlin:什么是kjsm文件?
  • 内部类inheritanceKotlin
  • 在Kotlin中,我可以创建一个向后计数的范围吗?
  • Kotlin - 当用返回types的函数expression时
  • 如何在Kotlin中分组后总结多个元素
  • 在Spring Boot项目中使用Gradle从Kotlin测试引用Java代码时未解决的参考
  • Kotlin lambda以Interface作为参数
  • 如何在Kotlin中实现一个java SAM接口?
  • 用于Java兼容性的公共字段
  • 在Kotlin中可以使用Mockito吗?
  • HashMap错误 - containsKey,get
  • Kotlin language will be the best programming language for Android.