Kotlin FP: преобразовать список <String>в карту - PullRequest
1 голос
/ 02 июня 2019

У меня есть список строк, я хочу преобразовать в карту вхождений. (~ Значения карты - это количество повторений строки в списке)

Настоятельно, я бы написал так:

fun transformMap(list: List<String>): Map<String, Int> {
    val map = mutableMapOf<String,Int>()
    for(n in list){
        map.put(n,map.getOrDefault(n,0) + 1)
    }
    return map.toMap()
}

Как написать это в функциональном программировании?

В Java 8+ это будет написано так

String[] note;
Map<String, Integer> noteMap = Arrays.stream(note)
         .collect(groupingBy(Function.identity(),
          collectingAndThen(counting(), Long::intValue)));

Ответы [ 2 ]

3 голосов
/ 02 июня 2019

Вы можете использовать Grouping от Kotlin, чтобы сделать это в одну строку через расширение Iterable<T>.groupingBy:

val myList = listOf("a", "b", "c", "a", "b", "a")
val myMap = myList.groupingBy { it }.eachCount()

println(myMap)
// Prints {a=3, b=2, c=1}
2 голосов
/ 02 июня 2019

Вы также можете использовать потоки в Kotlin. Но если вы хотите избежать потоков, вы можете использовать fold():

val list = listOf("a", "b", "c", "a")
val histogram = list.fold(mutableMapOf<String, Int>()) { map, s ->
    map[s] = map.getOrDefault(s, 0) + 1
    map
}.toMap()

println(histogram)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...