列表和地图排序

时间:2014-10-23 23:48:11

标签: list scala map tolist

在Scala中,如果我们按每对的第一个元素排序List[(Char, Int)],是否通过toMap转换为地图会保留排序吗?

如果是,是否通过toList将结果地图转换回列表保留排序?

2 个答案:

答案 0 :(得分:4)

不,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))

答案 1 :(得分:1)

如前所述,MapSet没有排序。然而,考虑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)