Учащийся Scala в настоящее время и должен был инвертировать Карту, чтобы сделать некоторое инвертированное значение-> ключевые поиски. Я искал простой способ сделать это, но придумал только:
(Map() ++ origMap.map(kvp=>(kvp._2->kvp._1)))
У кого-либо есть более изящный подход?
Предполагая, что значения уникальны, это работает:
(Map() ++ origMap.map(_.swap))
Однако в Scala 2.8 это проще:
origMap.map(_.swap)
Возможность делать это является частью причина, по которой Scala 2.8 имеет новую библиотеку коллекций.
Вы можете избежать файлов ._1 при итерации несколькими способами.
Вот один способ. При этом используется частичная функция, которая покрывает единственный случай, который имеет значение для карты:
Map() ++ (origMap map {case (k,v) => (v,k)})
Вот другой способ:
import Function.tupled
Map() ++ (origMap map tupled {(k,v) => (v,k)})
Итерация карты вызывает функцию с двухэлементным кортежем, а анонимная функция требует двух параметров. Function.tupled выполняет перевод.