我有一个scala地图myMap
,我想创建一对列表MyList
,如下所示:
对于myMap中的每个(k,v),MyList应该将元组(v.someMember,k)作为元素
使用map
和for
理解的结果是一张新地图。有没有更好的方法来做到这一点,而不是从一个空列表开始并添加元素,因为我遍历地图中的(键,值)对
var myList = List.empty[(Double, String)]
myMap foreach { case(k,v) => myList ::= (v.someMember, k) }
答案 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