我有一个字符串列表
val list = List("a", "b", "c", "d", "e")
我想要一个映射,其中键作为列表中项目的索引。所以我做了以下事情:
def mapByIndexes(list: List[String]): Map[Int, String] = (1 to list.size).zip(list).toMap
但是,生成的 map 不会保留索引顺序,我得到的结果是:
Map(5 -> "e", 1 -> "a", 2 -> "b", 3 -> "c", 4 -> "d")
如何修改上面的代码,以便获得具有以下自然顺序的 map ?
Map(1 -> "a", 2 -> "b", 3 -> "c", 4 -> "d", 5 -> "e")
注意:我知道我可以对结果 map 进行排序,但是我可以避免该步骤并创建一个已经保留顺序的 map 吗?
编辑:使用 ListMap
的解决方案,描述于 Scala LinkedHashMap.toMap preserves order?有效,但我不喜欢额外的括号和 _*
这么简单的事情。难道就没有其他东西可以让我有一个链接吗?如果没有,我会接受@pamu的回答。
最佳答案
I'm aware that I can just sort the resulting map
不,你不能。对 Map
进行排序没有意义。但也有 Map
实现以自然顺序存储键,例如 TreeMap
(IntMap
也是如此,IIRC)。请注意,它与保留插入顺序不同,如 ListMap
和 LinkedHashMap
所做的那样。
Solution with ListMap described at Scala LinkedHashMap.toMap preserves order? works, but I don't like additional parentheses and _* for so simple thing. Isn't there anything else so I can just have a chaining?
不(至少,我不这么认为),但你可以轻松定义它:
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
基本上是一个列表(正如其名称所示),因此其中的查找比任何合理的 map 实现都要慢。
当然,您可以使用 TreeMap
执行完全相同的操作。
关于scala - 将列表转换为映射,其中键为 Scala 中的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41361048/