Kotlin: Лучший метод слияния списка?

Kotlin список манипулировать / объединить вопрос:

Итак, я получил (изменяемый) список пар, которые выглядят примерно так

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

Мне нужно было бы перебрать список и завершить слияние:

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

Таким образом, в основном найдите все TICKTICK и объедините предыдущие два токена (т. TICKTICK Создайте новую пару с добавленными строками).

Моя нынешняя идея состояла в том, чтобы сделать вид для TICKTICK токенов TICKTICK а затем удалить предыдущий, текущий и следующий, а затем вставить вновь объединенный токен.

Кажется, должен быть более естественный путь …. Любые идеи ?

Также кажется, что у меня нет доступа к iteraror().previous хотя и указан по этой ссылке

Solutions Collecting From Web of "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] } 

Вот полная демонстрационная версия: (link)

В Kotlin 1.1.x нет windowed функции, поэтому вам придется реализовать ее самостоятельно или сделать то же самое с вашим кодом.