2013-05-05 33 views
3

我有一张地图......转换映射到一个排序列表

Map(a -> List(a, a), b -> List(b, b), l -> List(l, l)) 

我可以转换到一个列表

List((a,2), (l,2), (b,2)) 

通过简单地做myMap.toList();

但我想转换为排序列表 - 哪些排序在元组的第一个元素?

任何提示?

感谢

+0

您不能先将地图转换为有序地图吗? – 2013-05-05 20:58:48

回答

10

快速的解决方案:myMap.toList.sortBy(_._1)

这相当于myMap.toList.sortBy(tuple => tuple._1)_1从元组中获取第一个元素。

sortBy通常需要一个将已排序元素映射到某个值的函数,该值将用于比较正在排序的元素。

你也可以写这更冗长这样的:myMap.toList.sortBy {case (key, _) => key}

+0

当你转换为列表然后再遍历列表中的每个元素时,你的效率如何? – 2013-05-05 20:56:27

+0

你能解释一下__ 1的含义吗?是否每个元素都通过元组中的第一个元素进行比较? – 2013-05-05 20:58:56

+0

@MoreThanFive如果你想使用'List'这是不可变的,那么我不明白这是如何更有效(复杂度和复制量)。 – ghik 2013-05-05 20:59:13

0

根据您的使用情况下,也可适当首先使用的有序集合。

A TreeMap是一个SortedMap - 当您插入/移除值时,它会保持集合的排序,提供对数查找/插入。如果您的排序操作相对于插入/移除频繁发生,那么可能需要对固定时间操作进行折扣以便便宜地访问排序结果。

A 列表地图是一个基于列表的地图结构。查找/插入的效率非常低,但如果这些操作发生的频率较低,这可能是一个合适的选择。只要插入对,就必须对列表进行排序。