Scala: carte une carte à la liste de tuples
J'ai essayé d'utiliser la Carte.carte de convertir une carte dans une Liste de Tuples.
Toutefois, cela échoue. J'ai fait les expériences suivantes:
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))
Avis, comment une Liste est générée par des éléments uniques (r1), mais une Carte est produite pour les n-uplets (r3). Pas même en forçant le type de travail (r2). Seulement un appel explicite à Seq fait (r4) Donc ma question est, pourquoi/comment fonctionne la Carte.carte "automagiquement" créer une nouvelle Carte et non sur une liste, par exemple? En fait, quelle est le type de retour déterminée (Seq, Liste, etc.)
Quel est le problème avec
Rien n'est mauvais. Voir le commentaire ci-dessous.
m.toList
? Notez également que la cartographie sur une collection renvoie un autre recueil du même type, de sorte que vous ne pouvez pas vraiment de retour une liste de cartographie sur un Map
, sauf si vous appelez .toList
sur elle.Rien n'est mauvais. Voir le commentaire ci-dessous.
OriginalL'auteur user2051561 | 2015-02-27
Vous devez vous connecter pour publier un commentaire.
Un
Map
est un ensemble de tuples déjà.Lorsque vous mappez un
Map
, vous êtes à la cartographie de l' (clé, valeur) paires qu'il contient. Cela ne peut pas fonctionner, parce que vous êtes en enlevant les clés, et de ne retenir que les valeurs. Donc, ce que vous avez n'est plus unMap
, mais un pas ou deux de la hiérarchie de la collection, unIterable
:Forcer le type ne peut pas fonctionner, car un
Map[A, B]
n'est pas unList[(A, B)]
. C'est l'équivalent dem.map(identity)
. Remarquez comment vous vous êtes même accéder àe
avec tuple accesseurs:Ici,
Seq
est plus généralisée queList
:La solution la plus simple comme l'a indiqué @EndeNeu est simplement utiliser
toList
. Lorsque vousmap
une collection, il doit retourner l'original de la collection de type si il peut. Si le mappage d'unMap
doit retourner une autreMap
, à moins que la structure sous-jacente a fait, il n'est plus unMap
(comme la suppression des touches entièrement) dansr1
.r1
, comment neMap
connaître il faut se convertir à uneList
? Il aurait pu être quelque chose d'autre? Pourquoi pas un tableau? Je suis en supposant que leur est certains de la conversion implicite qui se passe ici. D'où mon test en forçant les types. En ce qui concerne les Tuples, fait sens. C'est la Carte de la convention.Il n'a pas le convertir en un
List
dansr1
--il retourneIterable
parce que c'est le plus proche de trait de la hiérarchie qui correspond au type de collection que vous avez.Map
s'étendIterable
.OriginalL'auteur Michael Zajac