在 Scala 中,如果我们List[(Char, Int)]
按每对的第一个元素排序,是否通过toMap
保留排序转换为映射?
toList
如果是这样,是否通过保留排序将生成的地图转换回列表?
不,Map
(和Set
)没有排序。您可以使用 Scala 的交互式解释器 (REPL) 进行检查:
scala> val elems = List('a'->1, 'b'->2, 'c'->3, 'd'->4, 'e'->5)
elems: List[(Char, Int)] = List((a,1), (b,2), (c,3), (d,4), (e,5))
scala> elems.toMap.toList
res8: List[(Char, Int)] = List((e,5), (a,1), (b,2), (c,3), (d,4))
但是,scala.collection
确实提供了一个SortedMap
,这可能是您正在寻找的,尽管我还没有使用这个实现。
编辑:实际上,这种转换还有一个更根本的问题:因为地图中不能有重复的键,所以不仅失去了对排序的保证,而且转换后列表中的元素可能更少。考虑一下:
scala> val elems = List('a'->1, 'a'->2)
elems: List[(Char, Int)] = List((a,1), (a,2))
scala> elems.toMap.toList
res9: List[(Char, Int)] = List((a,2))
如前所述,Map
并且Set
没有排序。然而,考虑TreeMap
哪些保留了对其键的排序;例如
val a = List(('z', 1), ('a', 4), ('b', 4))
a: List[(Char, Int)] = List((z,1), (a,4), (b,4))
val b = collection.immutable.TreeMap(a:_*)
b: scala.collection.immutable.TreeMap[Char,Int] = Map(a -> 4, b -> 4, z -> 1)
更新
注意
for ( (k,v) <- b ) yield k
res: scala.collection.immutable.Iterable[Char] = List(a, b, z)