排序数组[(int,int)]以在scala中列出

时间:2018-07-12 10:55:58

标签: arrays scala sorting quicksort

我目前正在使用Scala开发Spark框架。 我有一个数组C:Array [(int,int)],我想根据地图A:Map [int,int]的顺序对其进行排序。代码如下:

line 1:import scala.util.Sorting
line 2: object Test {
line 3:     def main(args: Array[String]){
line 4:     val A = Map(5 -> 41, 1 -> 43, 2 -> 41, 3 -> 59,4 -> 51 )
line 5:     val B= A.toList.sortBy(x => x._2)
line 6:     B.foreach(println)
line 7:     val C=Array((1,15),(2,9),(3,6),(4,3),(5,4))
line 8:     Sorting.quickSort(C)(Ordering[(Int)].on(k => (A.get(k._1).get)))
line 9:     for(j <- 0 to C.length-1){
line 10:        println(C(j))
line 11:       }
line 12:    }
line 13: }

当我根据值部分(第5行)对A进行排序并打印时,我得到的输出(第6行)是这样的:

(5,41)
(2,41)
(1,43)
(4,51)
(3,59)

但是当我根据A的关键部分(第8行)对C进行排序时,我得到以下输出(第9-11行)

(2,9)
(5,4)
(1,15)
(4,3)
(3,6)

因为(5,41)和(2,41)的值相同,并且在B中(5,41)出现在(2,41)之前。但是,根据A的关键部分对C进行排序后,为什么2出现在5之前。为什么B和C的结果都不一致?

请建议我更改代码,以在B和C中获得统一的结果。我希望C为:(5,4) (2,9) (1,15) (4,3) (3,6)

2 个答案:

答案 0 :(得分:0)

替换A.get(k._1).get可使您的订购变得不确定,如

B.map(_._1).indexOf(k._1),它将根据您想要的键B中的索引正确排序。

答案 1 :(得分:0)

OCMStub([gNSHTTPURLResponseMock allHeaderFields]).andReturn(header); 是无设计的,因此仅按Map进行排序可能会导致不确定的顺序。如果您的业务逻辑允许更改排序标准,请考虑通过在valuevalue + key上按Map进行排序来使其保持一致:

Array

请注意,为避免因找不到密钥而导致崩溃,请考虑将import scala.util.Sorting val A = Map(5 -> 41, 1 -> 43, 2 -> 41, 3 -> 59, 4 -> 51 ) val B = A.toList.sortBy(x => (x._2, x._1)) B // res1: List[(Int, Int)] = List((2,41), (5,41), (1,43), (4,51), (3,59)) val C = Array((1,15),(2,9),(3,6),(4,3),(5,4)) Sorting.quickSort(C)(Ordering[(Int, Int)].on( k => (A.get(k._1).get, k._1) )) C // res23: Array[(Int, Int)] = Array((2,9), (5,4), (1,15), (4,3), (3,6)) 与默认值一起使用(例如Int.MaxValue等)

gerOrElse