Также вы можете использовать foldLeft, вам нужно просто указать аккумулятор (в вашем случае Map [String, List [Int]]), который будет возвращен в результате, и написать некоторую логику внутри.Вот моя реализация.
def mapIndicesToWords(l:List[(Int,String)]): Map[String,List[Int]] =
l.foldLeft(Map[String, List[Int]]())((map, entry) =>
map.get(entry._2) match {
case Some(list) => map + (entry._2 -> (entry._1 :: list))
case None => map + (entry._2 -> List(entry._1))
}
)
Но с foldLeft элементы списка будут в обратном порядке, так что вы можете использовать foldRight.Просто измените foldLeft на foldRight и поменяйте местами входные параметры, от (map, entry)
до (entry, map)
.
И будьте осторожны, foldRight работает в 2 раза медленнее.Это реализовано с использованием метода reverse list и foldLeft.