Перебор списка с лямбдой для каждого котлина - PullRequest
0 голосов
/ 13 марта 2019

У меня есть список из 30 случайных чисел, которые соответствуют 1 из 8 цветов, и мне нужно перебрать 8 цветов (или 30 чисел) и найти, сколько раз каждый цвет встречается. Мне нужно сделать это, используя лямбда-выражения и функциональное программирование, поэтому нет традиционных циклов for.

val iterator = colours.toList().iterator()

iterator.forEach{

    println("$it count: " + (numbers
            .map{a -> colours[a]}
            .count{it == ("$it")}))
}

В настоящее время проблема в том, что мой вывод для счетчика составляет всего 50, а не конкретное количество раз, когда цвет появляется.

Если я сделаю это так:

println("Red count:" +    (numbers
        .map{a -> colours[a]}
        .count{it ==  ("red")}))

выводит правильное число, но не с циклом.

Что он выводит:

green count: 50 

red count: 50

что он должен выводить (например)

green count:9

red count:3

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Вам не нужно делать здесь вложенную итерацию. В настоящее время вы работаете в O (n ^ 2), так как вам нужно пройти по списку один раз для каждого элемента. Поскольку вы знаете, что работаете с небольшим числом потенциальных значений, вы можете вместо этого просто сгруппировать их по значению, а затем сопоставить значения с размером результирующих списков, т.е.

val colourNames = listOf("red", "green", "blue", "yellow", "orange", "indigo", "violet", "black")

// Generates 30 random numbers between 0 and 8 (exclusive)
val randomColours = (0 until 30).map { (0 until colourNames.size).random() }

val result = randomColours
  .groupBy { color -> colourNames[color] } // outputs a Map<String, List<Int>>
  .mapValues { (color, colorCountList) -> colorCountList.size } // Map<String, Int>

println(result) // {yellow=4, orange=4, red=5, indigo=3, blue=8, green=2, violet=2, black=2}
2 голосов
/ 13 марта 2019

Добавьте именованный параметр в цикл forEach.Неявное имя "it" затеняется функцией count.

val iterator = colours.toList().iterator()

iterator.forEach { colour ->

    println("$colour count: " + (numbers
        .map{a -> colours[a]}
        .count{it == ("$colour")}))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...