我正在尝试根据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
答案 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
。