Intereting Posts
Kotlin Android-Как реализовать CheckBox.OnCheckedChangeListener? Можно ли сохранить «Unit» в качестве возвращаемого типа функции Kotlin при вызове с Java? Spring FacebookTemplate вызывает исключение разрешения для профиля пользователя LibGDX Scene2d UI: проблемы с таблицей внутри таблицы Связывание данных Kotlin Android studio errors locationManager.getBestProvider возвращает значение null для API 15 (API <23) kotlin + эспрессо: не найдено никаких действий Невозможно найти явную активность (Котлин) Spring Data Elasticsearch с полем скриптов с данными класса данных Kotlin приводит к проблеме сериализации Джексона Как передать массив строк в намерение электронной почты Android Как буферизировать бесконечный прослушиватель прокрутки Не удалось слияние манифеста: при использовании модуля kotlin Контроль Anko doAsync () во время вращения экрана Почему публичный класс не может распространять частный класс? Как преобразовать метод класса <T> #cast из Java в Kotlin?

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 функции, поэтому вам придется реализовать ее самостоятельно или сделать то же самое с вашим кодом.