我有一张地图......转换映射到一个排序列表
Map(a -> List(a, a), b -> List(b, b), l -> List(l, l))
我可以转换到一个列表
List((a,2), (l,2), (b,2))
通过简单地做myMap.toList();
但我想转换为排序列表 - 哪些排序在元组的第一个元素?
任何提示?
感谢
我有一张地图......转换映射到一个排序列表
Map(a -> List(a, a), b -> List(b, b), l -> List(l, l))
我可以转换到一个列表
List((a,2), (l,2), (b,2))
通过简单地做myMap.toList();
但我想转换为排序列表 - 哪些排序在元组的第一个元素?
任何提示?
感谢
快速的解决方案:myMap.toList.sortBy(_._1)
。
这相当于myMap.toList.sortBy(tuple => tuple._1)
。 _1
从元组中获取第一个元素。
sortBy
通常需要一个将已排序元素映射到某个值的函数,该值将用于比较正在排序的元素。
你也可以写这更冗长这样的:myMap.toList.sortBy {case (key, _) => key}
当你转换为列表然后再遍历列表中的每个元素时,你的效率如何? – 2013-05-05 20:56:27
你能解释一下__ 1的含义吗?是否每个元素都通过元组中的第一个元素进行比较? – 2013-05-05 20:58:56
@MoreThanFive如果你想使用'List'这是不可变的,那么我不明白这是如何更有效(复杂度和复制量)。 – ghik 2013-05-05 20:59:13
根据您的使用情况下,也可适当首先使用的有序集合。
A TreeMap是一个SortedMap - 当您插入/移除值时,它会保持集合的排序,提供对数查找/插入。如果您的排序操作相对于插入/移除频繁发生,那么可能需要对固定时间操作进行折扣以便便宜地访问排序结果。
A 列表地图是一个基于列表的地图结构。查找/插入的效率非常低,但如果这些操作发生的频率较低,这可能是一个合适的选择。只要插入对,就必须对列表进行排序。
您不能先将地图转换为有序地图吗? – 2013-05-05 20:58:48