Какая операция из Kotlin Коллекции будет наиболее подходящей для группировки в списке тех же последовательных соседей? Допустим, у нас есть список:
['A', 'A', 'B', 'B', 'B', 'A', 'B']
, и я хотел бы получить список групп, разделенных при изменении элемента (с сохранением порядка):
[['A', 'A'], ['B', 'B', 'B'], ['A'], ['B']]
Вроде бы распространенный случай, поэтому я подумал, что он должен поддерживаться богатыми операциями Kotlin Collections, но я не нашел там ничего подходящего.
Я уже пробовал использовать reduce
, fold
и кажется, что все это вообще не касается этого случая. Я думаю, что использование groupBy
довольно близко к желаемому результату:
val chars: List<Char> = "AABBBAB".toList()
val groups = chars.groupBy { char -> char }
.map { (key, grouped) ->
grouped
}
Это работает почти хорошо, но объединяет одни и те же типы групп: [['A', 'A', 'A'], ['B', 'B', 'B', 'B']]
)
Я знаю, как это сделать что используются некоторые уродливые циклы и буферы, но мой вопрос заключается в том, как этого добиться, используя некоторые необычные Kotlin операции (или их комбинацию)?
Мой реальный случай немного сложнее (я бы хотел сгруппировать некоторые объекты по своему свойству способом, описанным выше).