【发布时间】:2011-06-18 14:17:20
【问题描述】:
如何将 Set("a","b","c") 转换为 Map("a"->1,"b"->2,"c"->3)? 我认为它应该与 toMap 一起使用。
【问题讨论】:
-
您是否希望 b 映射到 2,因为它是 Set 中的第二个?还是因为它是字母表中的第二个字母?正如其他海报所指出的那样,套装没有排序,所以第一个不起作用。
如何将 Set("a","b","c") 转换为 Map("a"->1,"b"->2,"c"->3)? 我认为它应该与 toMap 一起使用。
【问题讨论】:
zipWithIndex 可能是您正在寻找的。它将获取您的字母集合并创建一个新的元组集合,将值与集合中的位置相匹配。不过,您还有一个额外要求 - 看起来您的位置以 1 而不是 0 开头,因此您需要转换这些元组:
Set("a","b","c")
.zipWithIndex //(a,0), (b,1), (c,2)
.map{case(v,i) => (v, i+1)} //increment each of those indexes
.toMap //toMap does work for a collection of Tuples
一个额外的考虑 - 集合不保留位置。如果您希望上述位置始终有效,请考虑使用类似 List 的结构。
【讨论】:
这是另一种解决方案,它使用从 1 开始的所有自然数的 Stream 与您的 Set 一起压缩:
scala> Set("a", "b", "c") zip Stream.from(1) toMap
Map((a,1), (b,2), (c,3))
【讨论】:
toMap 仅在 Set 条目是键/值对(例如 Set(("a",1),("b",2),("c",3)))时才有效。
要得到你想要的,请使用zipWithIndex:
Set("a","b","c") zipWithIndex
// Set[(String, Int)] = Set((a,0), (b,1), (c,2))
或(如你原来的问题):
Set("a","b","c") zip (1 to 3) toMap
【讨论】:
这也可以:
(('a' to 'c') zip (1 to 3)).toMap
【讨论】: