我试图根据值元组对地图进行排序
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
上排序
发布于 2014-10-18 22:29:31
通常,您可以选择元组中的哪个元素在排序中具有优先级。
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
没有保留任何排序,因此结果仍然是一个序列。
发布于 2014-10-18 21:33:03
这就是你要找的吗?
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))
发布于 2014-10-19 09:57:08
分类元组
首先要注意的是,如果您对一个元组集合进行排序,您将得到与预期相同的结果,即首先比较第一项,然后再比较第二项。
例如,(a1, b1) > (a2, b2)
当且仅当(a1 > a2) || ((a1 == a2) && (b1 > b2))
。
因此,为了在元组排序方面获得预期的结果,您不需要做任何事情。
然后讨论如何根据值对map
进行排序,以及如何在排序后保持顺序。
对值排序map
您可以使用sortBy
方法的List
,然后使用有序的数据结构来保持排序,如下所示:
new scala.collection.immutable.ListMap() ++ data.toList.sortBy(_._2)
如果在Scala中运行此操作,您将得到后续的结果:
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
作为结果),那么甚至不需要使用ListMap
。
https://stackoverflow.com/questions/26445478
复制