DEV Community

kaede
kaede

Posted on

Kotlin 基礎 Part 8 -- groupBy と size を使って 連想配列の 重複したキーとその数のペアを出す

groupBy

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html

 val ids = listOf<String>("id1", "id2", "id2") print(ids.groupBy { it }) 
Enter fullscreen mode Exit fullscreen mode

{id1=[id1], id2=[id2, id2]}

配列を渡して、条件をそれ自体の it にすると
重複しているものをまとめてくれる

 val men = listOf( "Ai" to 3, "Bot" to 3, "Carl" to 5, "Dan" to 5, ) print(men.groupBy ({it.second}, {it.first}) ) 
Enter fullscreen mode Exit fullscreen mode

{3=[Ai, Bot], 5=[Carl, Dan]}

"name": age, のような連想配列を渡して、
2 つめの値で 1 つめの値をまとめるようにかける。

 val men = listOf( "id1" to "tom", "id1" to "cat", "id1" to "bob", "id2" to "dog", ) print(men.groupBy ({it.first}, {it.second}) ) 
Enter fullscreen mode Exit fullscreen mode

{id1=[tom, cat, bob], id2=[dog]}

なのでこのように、おなじ ID の 人の名前をまとめることができる。

id1, id2 のそれぞれの pair 型になっている?
この出力は使いにくいので、toList() すると

[(id1, [tom, cat, bob]), (id2, [dog])]

こうなる

これは map して

id1 が it.first
[tom, cat, bob] が it.second

こうやってとることができる。
なので 2 つめの size をとって

 val men = listOf( "id1" to "tom", "id1" to "cat", "id1" to "bob", "id2" to "dog", ) val menGroupedById = men.groupBy( {it.first}, {it.second} ).toList() val duplicatedIdAndCount = menGroupedById.map { it -> it.first to it.second.size } print(duplicatedIdAndCount) 
Enter fullscreen mode Exit fullscreen mode
[(id1, 3), (id2, 1)] 
Enter fullscreen mode Exit fullscreen mode

こうやって重複するキーと重複した数をまとめることができた


まとめ

key:value な連想配列に

arrayName.groupBy({it.first},{it.second}) 
Enter fullscreen mode Exit fullscreen mode

これをすると、key ごとに value をまとめてくれる。

その後リストにしてmap して
1 つめ ( key ) と
2 つめ ( key に紐づく value たちの配列 ) の長さ
これをまとめると

key:duplicatedKeyCount の配列が作れる。

Top comments (0)