scala - 将列表转换为映射,其中键为 Scala 中的索引

标签 scala list dictionary scala-collections

我有一个字符串列表

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)。请注意,它与保留插入顺序不同,如 ListMapLinkedHashMap 所做的那样。

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/

相关文章:

python - 如何将嵌套列表转换为字典?

c++ - 当具有 std::map<int,std::ofstream> 成员时,类不从 dll 导出

json - 如何在spark scala中将json字符串解析到不同的列?

java - java 和 scala 的 Maven 代码覆盖

Python 列表理解 : Using "if" Statement on Result of the Comprehension

c# - 并行列表属性

java - 将流中的列表附加到 map

scala - scala.Singleton 是纯编译器小说吗?

scala - 基于 ClassTag 的模式匹配对于基元失败

python - python中的单方括号和双方括号