Как получить отличное значение в списке результатов groupBy - PullRequest
1 голос
/ 02 мая 2019

У меня есть пользовательский вид, как показано ниже, который отлично работает.

val list = listOf(Pair("A", 1), Pair("A", 2), Pair("A", 1), Pair("B", 5))
val map = list.groupBy ({ it.first }, {it.second})

В результате я получаю

map = {A = [1, 2, 1], B = [5]}

Однако я хотел бы иметь только различное значение всписок то есть

map = {A = [1, 2], B = [5]}

Как мне этого достичь?

Ответы [ 3 ]

3 голосов
/ 02 мая 2019

Это может сделать работу:

val list = listOf(Pair("A", 1), Pair("A", 2), Pair("A", 1), Pair("B", 5))
val map = list.groupBy ({ it.first }, {it.second}).mapValues { it.value.distinct() }
2 голосов
/ 02 мая 2019

Сначала вы можете позвонить .distinct() в списке. Равенство для пар определяется как равенство обоих его компонентов.

Так после звонка

val list = listOf(Pair("A", 1), Pair("A", 2), Pair("A", 1), Pair("B", 5)).distinct()

list будет содержать [(A, 1), (A, 2), (B, 5)]. Тогда вы можете использовать .groupBy().

0 голосов
/ 02 мая 2019

Рано или поздно вы можете найти следующее интересное, используя Группировка / группировка и фолд :

val map = list.groupingBy { it.first }
        .fold(mutableSetOf<Int>()) { acc, e ->
            acc.apply {
                add(e.second)
            }
        }

Если вам не нравится, что MutableSet выставлено(так как тип map теперь будет Map<String, MutableSet<Int>>), вы все равно можете явно установить тип map, например val map : Map<String, Set<Int>> = ...

Или: если вам требуется такая функциональность чаще, выможет даже захотеть рассмотреть вашу собственную функцию расширения, аналогичную groupBy:

inline fun <T, K, V> Iterable<T>.groupByDistinctValues(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, Set<V>> = groupByDistinctValuesTo(LinkedHashMap(), keySelector, valueTransform)
inline fun <T, K, V, M : MutableMap<in K, MutableSet<V>>> Iterable<T>.groupByDistinctValuesTo(destination: M, keySelector: (T) -> K, valueTransform: (T) -> V): M {
    for (element in this) {
        val key = keySelector(element)
        val list = destination.getOrPut(key) { mutableSetOf() }
        list.add(valueTransform(element))
    }
    return destination
}

, которую вы затем можете использовать, аналогично следующему:

val map = list.groupByDistinctValues({it.first}) { it.second }
// where map is then of type Map<String, Set<Int>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...