list - Scala:将 Map 映射到元组列表

标签 list scala dictionary tuples seq

我尝试使用 Map.map 将 map 转换为元组列表。 然而这失败了。我做了以下实验:

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))

请注意如何为单个元素 (r1) 生成 List,但如何为元组 (r3) 生成 Map。甚至不强制类型有效(r2)。只有对 Seq 的显式调用才做到这一点(r4)所以我的问题是,为什么/如何 Map.map “自动”创建一个新的 Map 而不是列表?实际上返回类型是如何确定的(Seq、List等)

最佳答案

一个Map已经是元组的集合。

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

当您映射Map时,您正在映射它包含的(键,值)对。这是行不通的,因为你要去掉键,只保留值。所以你拥有的不再是 Map ,但在集合层次结构中向上一两步,即 Iterable :

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

强制类型无法工作,因为 Map[A, B]不是List[(A, B)] 。这相当于 m.map(identity) 。请注意您如何访问 e使用元组访问器:

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

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

在这里,SeqList 更通用:

val r4 = m.toSeq

@EndeNeu 所说的简单解决方案就是使用 toList 。当你 map一个集合,如果可以的话,它应该返回原始集合类型。所以映射一个Map应该返回另一个Map ,除非底层结构使其不再是 Map (就像完全删除键一样)在 r1 中.

关于list - Scala:将 Map 映射到元组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28769367/

相关文章:

c# - 根据另一个列表对列表进行排序,然后使用 LINQ 对其自身进行排序

python - DataClass 是否适合替换字典?

r - 子集 R 中的列表向量

html - 使用 List 模拟带有嵌套表格的动态表格 <ul> <li> 仅限 HTML 和 CSS

scala - Scala 导入中的双下划线是什么意思?

scala - 根据规则在 Spark 数据框中添加列

swift - 初学者 swift : Converting string if letter in dictionary

java - 如何迭代 arrayList 中的连续对

c - 使用 gcc 时 c 结构中的 "unknown type name"

Scala 特化用于基本类型的数值运算