Количество символов в строке - PullRequest
1 голос
/ 06 мая 2020

Я новичок в scala и FP в целом и пытаюсь попрактиковаться в этом на пустом примере.

val counts = ransomNote.map(e=>(e,1)).reduceByKey{case (x,y) => x+y}

Возникает следующая ошибка:

Line 5: error: value reduceByKey is not a member of IndexedSeq[(Char, Int)] (in solution.scala)

Приведенный выше пример похож на начальный пример FP по подсчету слов, я буду признателен, если вы укажете на мою ошибку.

Ответы [ 3 ]

6 голосов
/ 06 мая 2020

Похоже, вы пытаетесь использовать метод Spark для коллекции Scala. Эти два API имеют некоторое сходство, но reduceByKey не является его частью.

В чистом виде Scala вы можете сделать это так:

val counts =
  ransomNote.foldLeft(Map.empty[Char, Int].withDefaultValue(0)) {
    (counts, c) => counts.updated(c, counts(c) + 1)
  }

foldLeft перебирает коллекция слева, используя пустую карту счетчиков в качестве накопленного состояния (которое возвращает 0, если значение не найдено), которая обновляется в функции, переданной в качестве аргумента, путем обновления найденного значения с увеличением.

Обратите внимание, что прямой доступ к карте (counts(c)) может быть небезопасным в большинстве ситуаций (поскольку он вызовет исключение, если элемент не найден). В этой ситуации это нормально, потому что в этой области я знаю, что использую карту со значением по умолчанию. При доступе к карте вы чаще всего захотите использовать get, который возвращает Option. Подробнее об этом в официальной документации Scala ( здесь для версии 2.13.2).

Вы можете поиграть с этим кодом здесь, на Scast ie .

4 голосов
/ 06 мая 2020

На Scala 2.13 вы можете использовать новый groupMapReduce

ransomNote.groupMapReduce(identity)(_ => 1)(_ + _)
3 голосов
/ 06 мая 2020
val str = "hello"
val countsMap: Map[Char, Int] = str
  .groupBy(identity)
  .mapValues(_.length)

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