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.

  • ¿Cómo puedo get el nombre de una propiedad de Kotlin?
  • No se pueden agregar las extensiones de Kotlin para Android a mi proyecto
  • Obtén la function por nombre dinámicamente en Kotlin
  • Aplicación de Android en Gradle: no se puede combinar dex
  • Cómo agregar la dependencia RecyclerView - gradle 3
  • Reaccionar a la llamada de actualización
  • Moshi: se esperaba una Clase, Tipo Paramétrico o Tipo de Armario Genérico, pero <nulo> es de tipo nulo
  • Kotlin lateinit properties, peligro NPE?
  • Spring & kotlin: ¿Cuál es la diferencia entre el constructor y la inyección tardía?
  • Acceder a los ID de resources usando Kotlin y Anko
  • Esperando la statement del miembro