如何通过对scala Map的所有元素应用操作来创建List?

时间:2014-10-10 17:41:15

标签: scala

我有一个scala地图myMap,我想创建一对列表MyList,如下所示:

  

对于myMap中的每个(k,v),MyList应该将元组(v.someMember,k)作为元素

使用mapfor理解的结果是一张新地图。有没有更好的方法来做到这一点,而不是从一个空列表开始并添加元素,因为我遍历地图中的(键,值)对

var myList = List.empty[(Double, String)]
myMap foreach { case(k,v) => myList ::= (v.someMember, k) }

2 个答案:

答案 0 :(得分:3)

使用toList然后map

例如:

scala> Map("a" -> 1, "b" -> 2).toList.map { case (k, v) => (k.size, v) }
res12: List[(Int, Int)] = List((1,1), (1,2))

或者,如果您希望提高内存效率并且不分配中间列表,则可以在map breakOut

时构建列表
import scala.collection.breakOut

scala> val l: List[(Int, Int)] = Map("a" -> 1, "b" -> 2).map({ case (k, v) => (k.size, v) })(breakOut)
l: List[(Int, Int)] = List((1,1), (1,2))

答案 1 :(得分:0)

还要考虑这个理解语法(这里语义上等同于已经提出的map);例如

val myMap = Map (1.1 -> "abc" , 2.2 -> "xyz")

for ( (k,v) <- myMap.toList ) yield v(2) -> k

在问题陈述之后,

for ( (k,v) <- myMap.toList ) yield v.someMember -> k