在scala中,如何从map中获取一组键和值,具有正确的顺序(第i个键是第i个值)?

时间:2014-08-29 11:56:27

标签: scala scala-collections

说我在Scala中有一个地图 - key:String,value:String。

是否有一种简单的方法可以按相应的顺序获取键和值数组?例如。键数组的第i个元素应该是与values数组的第i个值相关的键。

我所尝试的是迭代地图并逐一获取它们:

valuesMap.foreach{keyVal => keys.append(keyVal.1); values.append(keyVal.2); // the idea, not the actual code

有简单的方法吗?

可能会问这个问题:有没有办法保证map.keys / map.values的具体顺序?

例如,在生成SQL查询时,可以方便地分别使用列名和值的数组,但顺序相同。

2 个答案:

答案 0 :(得分:7)

您可以使用toSeq来获取具有固定顺序的一对对,然后您可以按键(或对的任何其他函数)进行排序。例如:

scala> val pairs = Map(3 -> 'c, 1 -> 'a, 4 -> 'd, 2 -> 'b).toSeq.sortBy(_._1)
res0: Seq[(Int, Symbol)] = ArrayBuffer((1,'a), (2,'b), (3,'c), (4,'d))

现在您可以使用unzip将这对序列转换为一对序列:

scala> val (keys, vals) = pairs.unzip
keys: Seq[Int] = ArrayBuffer(1, 2, 3, 4)
vals: Seq[Symbol] = ArrayBuffer('a, 'b, 'c, 'd)

键和值将对齐,您只执行了一次排序操作。

答案 1 :(得分:1)

如果您想要的是键盘和价值列表排列,那么它真的很容易:

val (keys, vals) = yourMap.toSeq.unzip

原始地图的所有信息都保留了订购。你可以这样回来

val originalMap = (keys zip values).toMap
assert(originalMap == yourMap)