Изящный способ инвертировать карту в Scala

Учащийся Scala в настоящее время и должен был инвертировать Карту, чтобы сделать некоторое инвертированное значение-> ключевые поиски. Я искал простой способ сделать это, но придумал только:

(Map() ++ origMap.map(kvp=>(kvp._2->kvp._1)))

У кого-либо есть более изящный подход?

94
задан Seth Tisue 25 January 2014 в 13:36
поделиться

2 ответа

Предполагая, что значения уникальны, это работает:

(Map() ++ origMap.map(_.swap))

Однако в Scala 2.8 это проще:

origMap.map(_.swap)

Возможность делать это является частью причина, по которой Scala 2.8 имеет новую библиотеку коллекций.

165
ответ дан 24 November 2019 в 06:02
поделиться

Вы можете избежать файлов ._1 при итерации несколькими способами.

Вот один способ. При этом используется частичная функция, которая покрывает единственный случай, который имеет значение для карты:

Map() ++ (origMap map {case (k,v) => (v,k)})

Вот другой способ:

import Function.tupled        
Map() ++ (origMap map tupled {(k,v) => (v,k)})

Итерация карты вызывает функцию с двухэлементным кортежем, а анонимная функция требует двух параметров. Function.tupled выполняет перевод.

10
ответ дан 24 November 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: