使用不同的值重复键时的toMap

时间:2014-02-09 17:17:01

标签: scala functional-programming scala-2.8

我有一个清单

val data = List(2, 4, 3, 2, 1, 1, 1,7)

我想用它创建一个地图,以便上面列表中的值是新的值的关键,其中indeces为我尝试的新值

scala> data.zipWithIndex.toMap
res5: scala.collection.immutable.Map[Int,Int] = Map(1 -> 6, 2 -> 3, 7 -> 7, 3 -> 2, 4 -> 1)

但奇怪的是它给了res5(1)6,但我希望它是4。

我可以通过

解决它
data.zipWithIndex groupBy (_._1) mapValues (w=>w.map(tuple=>tuple._2) min)

但是有什么方法可以将函数f传递给toMap,以便以所需的方式创建地图。

1 个答案:

答案 0 :(得分:1)

toMap将按照压缩列表的顺序将每对添加到地图中,当您将地图k -> v添加到已包含k的地图时,旧价值只是被取代了。

一个简单的解决方法就是在压缩索引之后和转换为地图之前反转列表:

data.zipWithIndex.reverse.toMap

现在将在1 -> 6之前添加映射1 -> 51 -> 4,这意味着1 -> 4是您在结果中看到的映射。