Другого Scala новичка вопрос, так как я не получаю, как добиться этого в функциональном пути (в основном идет от языка сценариев фона):Scala - изменить строки в списке на основе их количества вхождений
У меня есть список строк:
val food-list = List("banana-name", "orange-name", "orange-num", "orange-name", "orange-num", "grape-name")
и где они дублированы, я хотел бы добавить увеличивающееся число в строку и получить, что в списке похож на входной список, например, так:
List("banana-name", "orange1-name", "orange1-num", "orange2-name", "orange2-num", "grape-name")
Я сгруппировал их, чтобы получить отсчеты для них:
val freqs = list.groupBy(identity).mapValues(v => List.range(1, v.length + 1))
Который дает мне:
Map(orange-num -> List(1, 2), banana-name -> List(1), grape-name -> List(1), orange-name -> List(1, 2))
Порядок списка важно (его должен быть в исходном порядке food-list
), поэтому я знаю, что для меня проблематично использовать карту на этом этапе. Ближайший я чувствую, что я получил в раствор:
food-list.map{l =>
if (freqs(l).length > 1){
freqs(l).map(n =>
l.split("-")(0) + n.toString + "-" + l.split("-")(1))
} else {
l
}
}
Это, конечно, дает мне шаткий вывод, так как я отображающий список частот от слов значения в freqs
List(banana-name, List(orange1-name, orange2-name), List(orange1-num, orange2-num), List(orange1-name, orange2-name), List(orange1-num, orange2-num), grape-name)
Как это делается в режиме Scala fp, не прибегая к неуклюжим для петель и счетчиков?
Можно ли считать каждый раз предыдущими вхождениями заданного значения, или это было бы слишком (O (n^2)) медленно? –
для моих целей, я не буду иметь слишком много списков, чтобы это имело заметную разницу, поэтому предыдущие случаи не были бы проблемой, но попытка выяснить, что эффективный подсчет в Scala, исходящий из Python, не очень очевиден для я на данный момент – roy
Метод 'count' (http://www.scala-lang.org/api/current/index.html#[email protected](p:A=>Boolean):Int) доступный на 'Seq's, так что я думаю, может быть очень похож на Python. Во всяком случае, мое решение в конце не использовало его, хотя оно требовало «обратного», поэтому оно не является самым эффективным. –