Поскольку отладка многопоточных приложений с операторами печати сведет Вас с ума. Да можно все еще сделать это с операторами печати, но Вам были бы нужны многие из них, и распутывание последовательной печати из операторов для эмуляции многопоточного executiong будет долго занимать много времени.
Человеческие мозги являются только однопоточными, к сожалению.
В Scala 2.8.0:
list.groupBy(_.length)
Нет ничего проще!
Если вы не против плохой производительности:
val list = List( "foo", "bar", "spam" )
val keyValue = for (length <- list map (_ length) removeDuplicates;
strings = list filter (_.length == length))
yield (length -> strings)
val map = Map(keyValue: _*)
Проблема в том, что список читается снова для каждой разной длины.
Теперь о безобразии вашей версии, возможно, это помогает:
list.foldLeft(Map[Long, List[String]]()) {
(m, s) => m(s.length) = s :: m.getOrElse(s.length, Nil)
}
Лучше? Это все еще не совсем хорошо, потому что вы получаете длину вдвое. У этого нет этой проблемы, но он немного уродливее:
list.foldLeft(Map[Long, List[String]]()) {
(m, s) => val length = s.length; m(length) = s :: m.getOrElse(length, Nil)
}