Разница между двумя функциями в Scala, foreach не может накапливать внешнюю карту - PullRequest
0 голосов
/ 23 сентября 2018

Я новый ученик, я хочу посчитать количество разных слов из файла.

Это отлично работает

val filePath = "C:\\Users\\76274\\Desktop\\yaml.txt"
def exercise2(file:String): HashMap[String,Int] ={
  Source.fromFile(file).getLines().foldLeft(HashMap[String,Int]())(
  (result,str) =>
    str.split("\\W+").foldLeft(result)(
      (result,word) => result + (word.toLowerCase -> (result.getOrElse(word.toLowerCase,0) + 1)))) 
}

И это вернет пустую карту

val filePath = "C:\\Users\\76274\\Desktop\\yaml.txt"
def exercise2(file:String): HashMap[String,Int] ={
Source.fromFile(file).getLines().foldLeft(HashMap[String,Int]()){
  (result,str) => {
    str.split("\\W+").foreach(word => {
    result + (word.toLowerCase -> (result.getOrElse(word.toLowerCase,0) + 1))
    println(result)
  })}
  result
}
}

Я не знаю, почему последняя не работает.Как программист Java, я думаю, что он тоже должен работать нормально.Я надеюсь, что вы можете объяснить это, спасибо!

1 Ответ

0 голосов
/ 23 сентября 2018

Причина, по которой второй не работает, заключается в том, что метод + на самом деле не добавляет элементы в Map , а создает новую карту с добавленным данным элементом /обновлено - scaladoc .

Если вы хотите, чтобы второй работал с использованием карты MUTABLE , вы можете использовать метод += - scaladoc .Кстати, если вы собираетесь использовать изменяемое решение, я бы не стал использовать Fold на первом уровне, но вместо этого - другой foreach.

Однако в Scala мы предпочитаем быть неизменяемыми, поэтому мы быперейдите к первому с картой IMMUTABLE .

PS: Не имеет к этому никакого отношения, но если вам действительно не нужен HashMap, предпочтите Map trait (который по умолчанию является неизменным) или scala.collection.mutable.Map (который является изменяемым) .Также для создания пустой коллекции чаще всего вызывается метод empty вместо пустого apply ().например, Map.empty[String, Int].

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