2010-02-03 30 views
22

İki listem var, List[A] ve List[B]. İstediğim bir Map[A,B] ama ben zip semantiği istiyorum. Yani şöyle başladı:Scala'da, iki listeyi bir Haritaya dönüştürmenin bir yolu var mı?

var tuplesOfAB = listOfA zip listOfB 

Şimdi benim tuplesOfAB bir Map nasıl oluşturulacağını emin değilim.

Takip eden bir soru olarak, Map[A,B] numaralı telefondan bir Map[B,A] oluşturabileceğim şekilde haritayı da tersine çevirmek istiyorum. Biri bana bir ipucu ile vurabilir mi?

+1

teşekkürler. Onu bulmak için buraya geldim. Şimdi kendime sormam gerekmiyor. – wheaties

cevap

26

bu CanBuildFrom işlevselliği (as described by Daniel) kullanılarak ve sonuç türü ne olması gerektiği konusunda derleyiciye bir tip talimatbreakOut kullanarak gerçekten basittir:

import scala.collection.breakOut 
val m = (listA zip listB)(breakOut): Map[A,B] 

aşağıdaki olur Ayrıca işe: (Eastsun, aşağıda işaret ettiği gibi)

val n: Map[A,B] = (listA zip listB)(breakOut) 

Ve

bu eklendi Kütüphane toMap

val o = (listA zip listB).toMap 

olarak haritayı ters gelince, bunu yapabilirsiniz:

val r = m.map(_.swap)(breakOut): Map[B, A] 
+4

val m = (listA zip listB) toMap da scalada çalışır. – Eastsun

+0

Ah! Bu yöntem (r20327) –

+1

evet var olan 2.8 yapısında mevcut değil, bir başka soruya cevap olarak, paulp yazmanın ne kadar kolay olduğunu gösterdikten sonra yakın zamanda eklendi. Daha sonra her büyük koleksiyonun zaten temsil edildiği için lib'e eklemeyi önerdi. –

15

Şimdi bir tupl listesi var, Map(tuplesOfAB: _*) yazarak bir harita haline getirmek kolaydır. : _* notasyonu, sıradan alınan argümanlarla varargs aşırı yükünü çağırmak anlamına gelir. Bu komik bir sözdizimine benziyor, ancak vararg'ların Map[A,B](pairs: (A,B)*) gibi bildirildiğini ve : _*'un ortak * bölümünden dolayı varargs'a dönüştürülecek türden bir açıklama olduğunu düşünmeye yardımcı oluyor.

Bir haritayı ters çevirmek için m kullanın Map(m.map(_.swap): _*). Scala'da bir harita da çiftler topluluğudur. Bu, bu çiftleri öğeleri değiştirerek ve Harita yapıcısına ileterek dönüştürür. 2.8 yılında

+0

Bu güzel, teşekkürler! –

5

zaten gösterilenler ötesinde, bunu yapmanın başka bir yolu henüz yok. İşte: Bu sorduğunuz için

Map() ++ tuplesOfAB 
4
scala> List("a", "f", "d") zip List(7, 5, 4, 8) toMap 
res0: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 7, f -> 5, d -> 4) 
İlgili konular