J_Strauton
J_Strauton

Reputation: 2418

How to group a list by a value?

I have a list and I want to make an object of all the values that contain a certain id.

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

From that list I want to make a new list of type Container

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

How can I do this in an efficient way without going O(n^2)?

Upvotes: 2

Views: 700

Answers (1)

Giorgio Antonioli
Giorgio Antonioli

Reputation: 16214

You can use groupBy + map. The implementation of groupBy is O(n) and the implementation of map is O(n) so the total runtime is O(2n) which is O(n).

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

Since this is so short and readable, I'd avoid to make further optimizations if not strictly needed but, if you'd need some further optimizations, you can reduce also the space cost avoiding to allocate multiple lists for example.

Upvotes: 5

Related Questions