Как сгруппировать список по значению? - PullRequest
2 голосов
/ 01 мая 2020

У меня есть список, и я хочу создать объект из всех значений, которые содержат определенный идентификатор.

val list = listOf(A(id = 1), A(1), A(2), A(3), A(2))

Из этого списка я хочу создать новый список типа Container

data class Container(
   val id: Long // The id passed into A.
   val elementList: List<A> // The elements that contain the ID.
)

Как я могу сделать это эффективно, не используя O (n ^ 2)?

1 Ответ

5 голосов
/ 01 мая 2020

Вы можете использовать groupBy + map. Реализация groupBy равна O (n) , а реализация map равна O (n) , поэтому общее время выполнения составляет O (2n) O (n) .

list.groupBy { it.id }.map { (id, elementList) -> Container(id, elementList) }

Поскольку это так коротко и читабельно, я бы не стал проводить дальнейшую оптимизацию, если в этом нет особой необходимости, но если вам понадобятся некоторые Дальнейшая оптимизация позволяет также снизить стоимость пространства, избегая, например, выделения нескольких списков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...