Группировка по списку ключей (Kotlin) - PullRequest
1 голос
/ 15 января 2020

Предположим, у меня есть

class Question(val tags:List<String>, val text:String)

, который (очевидно) имеет несколько тегов в дополнение к другим атрибутам.

Я хочу преобразовать количество экземпляров Вопроса в (один!) тег к карте вопросов, такой как: Map<String,List<Question>>.

Как мне это сделать? Простой groupBy { it.tags } обеспечивает Map<List<String>,List<Question>>

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Универсальная c функция расширения для этого, как я уже несколько раз требовал:

fun <T, K> Iterable<T>.groupByMany(
    keyExtractor: (T) -> Iterable<K>
): Map<K, List<T>> = mutableMapOf<K, MutableList<T>>()
    .also { grouping ->
        forEach { item ->
            keyExtractor(item).forEach { key ->
                grouping.computeIfAbsent(key) { mutableListOf() }.add(item)
            }
        }
    }

Использование:

val byTag = questions.groupByMany { it.tags }
0 голосов
/ 15 января 2020
val questions: Iterable<Question> = ....
val map = HashMap<String, MutableList<Question>>()
questions.forEach { question ->
    question.tags.forEach { tag ->
        val otherQuestions = map[tag]
        if (otherQuestions == null) map[tag] = arrayListOf(question)
        else otherQuestions.add(question)
    }
}
val resultMap: Map<String, List<Question>> = map
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...