2015-02-27 22 views
10

Bir haritayı bir Tuple listesine dönüştürmek için Map.map'i kullanmayı denedim. Ancak bu başarısız olur. Bir Liste tek elemanlar (r1) ancak Harita küpe (r3) için üretilen için nasıl üretildiğiniScala: Bir haritayı bir haritaya ekle Harita

val m = Map(("a" -> 1), ("b" -> 2)) 
     //> m :  scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2) 
val r1 = m.map{ case (k,v) => v}    //> r1 : scala.collection.immutable.Iterable[Int] = List(1, 2) 
def toTuple[A,B](a:A,b:B) = (a,b)    //> toTuple: [A, B](a: A, b: B)(A, B) 
//val r2: List[Tuple2[_,_]] = m.map(e => (e._1,e._2)) 
val r3 = m.map(e => toTuple(e._1,e._2))   //> r3 : scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2) 
val r4 = m.toSeq        //> r4 : Seq[(String, Int)] = ArrayBuffer((a,1), (b,2)) 

Bildirimi: Aşağıdaki deneyler yaptık. Çalışılan türü bile zorlamıyor (r2). Seq'e sadece açık bir çağrı yaptı (r4) Bu yüzden benim sorum, Map.map'ın "otomatik olarak" yeni bir Harita oluşturup örneğin bir liste oluşturmasına neden gerek yok? Gerçekte, dönüş tipi nasıl belirlenir (Sıra, Liste, vb.)

+6

'm.toList' ile ilgili sorun nedir? Ayrıca, bir koleksiyondaki eşlemenin, aynı türden başka bir koleksiyona geri döndüğünü de unutmayın, bu nedenle, üzerinde '.toList 'ifadesini aramadıkça, bir' Harita 'üzerinde bir liste eşleştirmesi yapamazsınız. –

+0

@Ende - Hiçbir şey yanlış değil. Aşağıdaki yoruma bakın. – user2051561

cevap

14

A Map zaten bir dizi tuplindir. Bir Map haritalama bittiğinde

scala> "b" -> 2 
res0: (String, Int) = (b,2) // Implicitly converted to a Tuple 

, bunu içerdiğini (anahtar, değer) çiftlerini haritalama ediyoruz. Bu işe yaramaz, çünkü anahtarları söküp sadece değerleri koruyorsun. Yani ne var artık Map, ama adım veya toplama hiyerarşisinde en fazla iki, bir Iterable: Bir Map[A, B] bir List[(A, B)] çalışamaz türünü zorlamak

val r1 = m.map{ case (k,v) => v} 

, olmadığı için. Bu m.map(identity) eşdeğeridir. Hatta tanımlama grubu erişimcilerle e erişiyorsunuz nasıl Uyarı: Burada

val r2: List[Tuple2[_,_]] = m.map(e => (e._1,e._2)) 

val r3 = m.map(e => toTuple(e._1,e._2)) 

, SeqList daha genelleştirilmiş geçerli:

val r4 = m.toSeq 

@EndeNeu belirttiği gibi basit bir çözüm sadece toList kullanmaktır. map koleksiyonu olduğunuzda, orijinal koleksiyon türünü iade edebilir. Dolayısıyla, Map'u eşlemek, temel yapı'da artık bir Map (anahtarları tamamen kaldırmak gibi) yapmadıkça başka bir Map döndürmelidir.

+0

Teşekkürler m-z. Sorum şu: “r1” durumunda, “Harita” nın bir “List” e dönüşmesi gerektiğini nasıl biliyor? Başka bir şey olabilir mi? Neden bir dizi değil? Onların burada bazı gizli dönüşümler olduğunu farz ediyorum. Bu yüzden türleri zorlayarak test etmem. Tuples ile ilgili olarak, mantıklı. Bu harita sözleşmesi. – user2051561

+0

@ user2051561 Bu, 'r1' içindeki bir 'List''e dönüştürmez - 'Yinelenen' değerini döndürür çünkü bu, sahip olduğunuz koleksiyonun türüyle eşleşen hiyerarşiye bir sonraki en yakın özelliktir. "Harita", "Yinelenebilir" yi uzatır. –