我有一个字符串清单
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
)。请注意,与ListMap
和LinkedHashMap
一样,它与保留插入顺序不同。
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
完全相同。