У меня есть два списки, a List[A]
и a List[B]
. То, что я хочу, является a Map[A,B]
но я хочу семантику zip
. Так начатый как так:
var tuplesOfAB = listOfA zip listOfB
Теперь я не уверен, как создать a Map
от моего tuplesOfAB
.
Как последующий вопрос, я также хочу инвертировать свою карту так, чтобы от a Map[A,B]
Я могу создать a Map[B,A]
. Кто-либо может поразить меня палкой подсказки?
В 2.8 Это действительно просто, используя функциональность Canbuildfrom
функциональности (, как описано Daniel ) и с использованием прорыва
с типом Инструкция к компилятору относительно того, какой тип результата должен быть:
import scala.collection.breakOut
val m = (listA zip listB)(breakOut): Map[A,B]
следующее также будет работать:
val n: Map[A,B] = (listA zip listB)(breakOut)
и (как oastSun, ниже, указал), это было добавлено в библиотеку как TOMAP
val o = (listA zip listB).toMap
Что касается обратного изменения карты, вы можете сделать:
val r = m.map(_.swap)(breakOut): Map[B, A]
Теперь, когда у вас есть список кортежей, его легко превратить в карту, написав Map (tuplesOfAB: _ *)
. Обозначение : _ *
означает вызов перегрузки varargs с аргументами, взятыми из последовательности. Это кажется забавным синтаксисом, но помогает предположить, что varargs объявлены как Map [A, B] (пары: (A, B) *)
и : _ *
- это аннотация типа для преобразования в varargs из-за общей части *
.
Чтобы перевернуть карту m
, используйте Map (m.map (_. Swap): _ *)
. В scala карта также представляет собой набор пар. Это преобразует эти пары, меняя местами элементы и передавая их конструктору карты.
Есть еще один способ сделать это, помимо уже показанных. Здесь:
Map() ++ tuplesOfAB