Котлин: преобразовать список объектов в карту свойств объекта - PullRequest
0 голосов
/ 12 декабря 2018

С указанными ниже классами данных:

data class Photo(val id: String)
data class Album(val id: String, val photos: List<Photo>)

Я хочу иметь возможность превратить список Albums в карту Map<photoId, Set<albumId>>

, например:

val albums = listOf(
    Album("1", listOf(
        Photo("1"),
        Photo("2"),
        Photo("3")
    )),
    Album("2", listOf(
        Photo("1"),
        Photo("2")
    ))
)

преобразуется в:

val map = mapOf(
    Pair("1", setOf("1", "2")),
    Pair("2", setOf("1", "2")),
    Pair("3", setOf("1")
)

Есть ли способ сделать это, используя функции преобразования kotlin / lambdas?например, groupBy, flatMap?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Чистящее средство

val grouped = albums
    .flatMap { album -> album.photos.map { photo -> Pair(photo.id, album.id) } }
    .groupBy( { (photoId, _) -> photoId }, { (_, albumId) -> albumId } )
    .mapValues { it.value.toSet() }

И проверьте правильность

val map = mapOf(
    Pair("1", setOf("1", "2")),
    Pair("2", setOf("1", "2")),
    Pair("3", setOf("1"))
)

check(map == grouped) // Success

Немного объяснений

  • С первым flatMap мыпреобразовать список альбомов (List<Album>) в List<Pair<String, String>> (photo.id в album.id).

  • С помощью groupBy мы преобразуемвторой список в Map<String, List<String>>, где ключ равен photo.id и сгруппирован по album..id

  • С помощью mapValues мы преобразуем карту в Map<String, Set<String>>

0 голосов
/ 12 декабря 2018

Грязный раствор:

val map = albums.map {
    it.photos.map { it.id } // get all photos in all album
}.flatten() // into a single list (instead of 2-d list)
    .toSet() // remove duplicates
    .associate { photo ->
        photo to albums.filter { it.photos.contains(Photo(photo)) } // for each photo, find its existance in all albums
            .map { it.id }.toSet() // output album ids
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...