我有一个字符串清单

val list = List("a", "b", "c", "d", "e")


我想有一张地图,上面有钥匙作为列表中项目的索引。所以我做了以下事情:

def mapByIndexes(list: List[String]): Map[Int, String] = (1 to list.size).zip(list).toMap


但是,结果映射不保留索引顺序,因此我得到了这个结果:

Map(5 -> "e", 1 -> "a", 2 -> "b", 3 -> "c", 4 -> "d")


如何修改上面的代码,以便获得具有以下自然顺序的地图?

Map(1 -> "a", 2 -> "b", 3 -> "c", 4 -> "d", 5 -> "e")


注意:我知道我可以对生成的地图进行排序,但是可以避免执行该步骤并创建一个已经保留订单的地图吗?

编辑:在Scala LinkedHashMap.toMap preserves order?中描述的ListMap解决方案是可行的,但是我不喜欢额外的括号和_*这样简单的内容。还没有其他东西可以让我链接吗?如果没有,我会接受@pamu的答案。

最佳答案

我知道我可以对生成的地图进行排序


不,你不能。对Map排序没有任何意义。但是有些Map实现以自然顺序存储密钥,例如TreeMap(IIRC也使用IntMap)。请注意,与ListMapLinkedHashMap一样,它与保留插入顺序不同。


Scala中描述的ListMap解决方案LinkedHashMap.toMap是否保留顺序?可以,但是我不喜欢额外的括号和_ *这样简单的东西。还没有其他东西可以让我链接吗?


不(至少,我不这么认为),但是您可以轻松定义它:

implicit class ToListMap[A, B](x: Seq[(A, B)]) {
  def toListMap = ListMap(x: _*)
}

// somewhere where ToListMap is in scope or imported:
val list = List(1 -> 2, 3 -> 4)
list.toListMap


请注意,ListMap基本上是一个列表(顾名思义),因此在其中查找比任何合理的映射实现都要慢。

当然,您可以使用TreeMap完全相同。

08-28 15:59