将Array [(String,String)]转换为Map [String,String],保持Scala中键的顺序

时间:2018-03-23 13:44:02

标签: scala

我正在尝试将数组[(字符串,字符串)] 转换为scala中的 Map [String,String]

我正在尝试 toMap 转换为地图。

问题:它正在改变值的顺序。

期望:不应更改订单。

由于

3 个答案:

答案 0 :(得分:1)

我认为这会奏效......

AudioListener类使用哈希表实现可变映射。迭代器和此类的所有遍历方法按插入顺序访问元素。

LinkedHashMap

答案 1 :(得分:0)

评论后:

看起来天真的方法在某种意义上不会起作用,因为键的顺序会被保留。这是一个非常有用的测试脚本来自

andrey-tyukin

  for (s <- 1 until 100) {
    val keys = (1 to s).map(_.toString).toList
    val arr: Array[(String, String)] = keys.map { x => (x, x) }.toArray
    val m = arr.toMap
    val newKeysOrder = m.map(_._1).toList println (s + ": " + (keys == newKeysOrder))
  }

基本上它表明这种做法并不好。

Array(("foo","a"), ("bar", "b"), ("baz", "c")).toList.toMap

但我建议避免使用可变数据结构。

New Anser:

我只想使用scala.collection.immutable.ListMap中的另一个简单构造:

val m = ListMap(arr:_*)

这是一个测试它是否是o.k的脚本。基本上它适用于前100个整体

  for (s <- 1 until 100) {
    val keys = (1 to s).map(_.toString).toList
    val arr: Array[(String, String)] = keys.map { x => (x, x) }.toArray
    val m = ListMap(arr: _*)
    val newKeysOrder = m.keys.toList
    println(s + ": " + (keys == newKeysOrder))
  }

答案 2 :(得分:0)

您可以使用ListMap通过使用基于列表的数据结构来实现不可变映射。

ListMap维护插入顺序并返回ListMap。

1.创建一个数组

 val arr=Array(("a","Alice"),("b","Bob"),("c","Cat"),("d","Dog"))

2.创建ListMap

import scala.collection.immutable._
val listMap=arr.foldLeft(ListMap[String,String]())((prev,next)=>prev+(next._1->next._2))

3.它将产生以下输出

listMap: scala.collection.immutable.ListMap[String,String] = Map(a -> Alice, b -> Bob, c -> Cat, d -> Dog)