Kotlin: ¿Mejor técnica de fusión de lists?

Pregunta de manipulación / fusión de la list Kotlin:

Así que obtuve una list (mutable) de pares que se parecen a esto

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

Tendría que recorrer la list y terminar fusionándome con esto:

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

Básicamente, encuentre todas las ocurrencias de tokens de TICKTICK y TICKTICK los dos tokens anteriores (es decir, cree un nuevo par con las cadenas agregadas juntas).

Mi idea actual era hacer una búsqueda para TICKTICK tokens TICKTICK y luego eliminar anterior, actual y siguiente y luego insert un token recién fusionado.

Parece que debería haber una forma más natural … Alguna idea ?

También parece que no tengo acceso a iteraror().previous aunque iteraror().previous indicado por este enlace

Con Kotlin 1.2, también puede usar la nueva function stdlib windowed window que representa los elementos como instantáneas de una window deslizante, por ej.

 println(listOf(1, 2, 3, 4, 5, 6).windowed(3)) // [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]] 

Luego revise el IDENTIFIER, TICKTICK, IDENTIFIER patrón IDENTIFIER, TICKTICK, IDENTIFIER contra la window y, si coincide (y si los tres elementos aún no se han reemplazado), guarde la información que reemplaza los elementos en estos índices por uno solo.

 val pattern = listOf(IDENTIFIER, TICKTICK, IDENTIFIER) // Stores indices of items that are not replaced: val indicesOfNormalItems = items.indices.toMutableSet() 

El bucle sobre las windows que también recoge los elementos resultantes en un map con la key del primer índice del triple:

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

Luego recopile el resultado, combinándolo de los elementos que no fueron reemplazados y los valores del map:

 val result = items.indices.mapNotNull { index -> if (index in indicesOfNormalItems) items[index] else replaced[index] } 

Aquí hay una demo completa ejecutable: (enlace)

En Kotlin 1.1.x no hay function de windowed , por lo que tendrá que implementarlo por su count o hacer lo mismo con su código.

  • ProcessBuilder no puede encontrar Kotlin en path
  • Android ProgressBar indeterminado no aparece
  • ¿Por qué Kotlin for Android Developers (el libro) necesita agregar extensiones parseList nuevamente?
  • Spring Boot Application: File System Watcher para muchas routes
  • Gradle. Kotlin: ¿es posible crear tareas dinámicas ("en vuelo")?
  • ¿Cómo pasar el tipo anulable a la function que toma un tipo no nulo?
  • ¿Cómo usar Anko DSL dentro de un Fragmento?
  • Kotlin: Scoping usando Object vs Class
  • Clase Derivada Parcelable en Kotlin
  • Prueba de unidades de Mockito: en todas las invocaciones de methods de una class, devuelve "verdadero"
  • La interoperabilidad Varargs Kotlin Java no funciona correctamente