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)