Scala - 根据元组值对地图进行排序

时间:2014-10-18 23:08:43

标签: scala data-structures scala-collections scala-2.10 sortedmap

我正在尝试根据Value Tuples

对Map进行排序
val data = Map("ip-11-254-25-225:9000"  -> (1, 1413669308124L), 
               "ip-11-232-145-172:9000" -> (0, 1413669141265L), 
               "ip-11-232-132-31:9000"  -> (0, 1413669128111L), 
               "ip-11-253-67-184:9000"  -> (0, 1413669134073L), 
               "ip-11-232-142-77:9000"  -> (0, 1413669139043L))

排序标准应该基于元组中的值

我试过

SortedMap[String, (Long,Long)]() ++ data

但没有成功。

有人可以建议一个更好的方法来先排序tuple._1,然后排在tuple._2

3 个答案:

答案 0 :(得分:2)

通常,您可以选择元组中哪个元素在排序中具有优先级;考虑一下

data.toSeq.sortBy {case (k,(a,b)) => (k,a,b) }

case模式中,我们提取(嵌套)元组的每个元素。在上面的表达式中,我们按键排序,然后按值元组中的第一个元素排序,然后排序第二个。另一方面,这个

data.toSeq.sortBy {case (k,(a,b)) => (k,b) }

将按值元组中的键和最后一个元素进行排序,这个

data.toSeq.sortBy {case (k,(a,b)) => (a,b) }

按地图的值;这一个

data.toSeq.sortBy {case (k,(a,b)) => (b) }

将按值元组中的最后一个元素排序。

更新正如@Paul所指出的那样Map保留了没有排序,因此结果仍然是序列。

答案 1 :(得分:1)

这是你要找的吗?

data.toVector.sortBy(_._2)

这将按值(元组)对条目进行排序,其中顺序取决于两个元组参数。元组的默认排序行为是对_1进行排序,然后对_2进行排序:

Vector((2,1), (1,2), (1,3), (1,1)).sorted
// Vector((1,1), (1,2), (1,3), (2,1))

答案 2 :(得分:1)

排序元组

首先请注意,如果您对元组的集合进行排序,您将获得与预期相同的结果,即首先比较第一个项目,然后比较第二个项目。

例如(a1, b1) > (a2, b2)当且仅当(a1 > a2) || ((a1 == a2) && (b1 > b2))

因此,为了在排序元组方面获得预期结果,您不需要做任何事情。

然后,如何根据值对map进行排序以及如何在排序后保留订单仍然存在。

上排序map

您可以使用sortBy的{​​{1}}方法,然后使用有序数据结构来保留排序,如下所示:

List

如果你在Scala REPL中运行它,你将得到以下结果:

new scala.collection.immutable.ListMap() ++ data.toList.sortBy(_._2)

如果您只是想对它们进行排序并遍历结果(即如果您不需要scala> new scala.collection.immutable.ListMap() ++ data.toList.sortBy(_._2) res3: scala.collection.immutable.ListMap[String,(Int, Long)] = Map(ip-11-232-132-31:9000 -> (0,1413669128111), ip-11-253-67-184:9000 -> (0,1413669134073), ip-11-232-142-77:9000 -> (0,1413669139043), ip-11-232-145-172:9000 -> (0,1413669141265), ip-11-254-25-225:9000 -> (1,1413669308124)) ),则甚至不需要使用map