如何在Scala中排序整数元组列表

jim*_*s17 4 sorting scala

我有一个整数元组列表

List[(Int, Int, Int)] = List((2,1,3), (4,2,6), (4,7,9), (6,3,9), (6,7,11),
          (6,17,19), (8,4,12), (8,14,18), (10,5,15), (12,1,17), (12,6,18))
Run Code Online (Sandbox Code Playgroud)

我想通过增加c来对它们进行排序,但是如果有相同c的元组则通过增加b来对它们进行排序.因此,在这种情况下,(4,7,9),(6,3,9)的情况我喜欢(6,3,9),(4,7,9).

不幸的是,我所做的并不奏效.

     def order(k: List[(Int, Int, Int)]) = {
        var t = List[Int]()
        if (k.map(_._3) == t) {
            k.sortBy(_._2)
            t = k.map(_._3)
            k
        } else {
            k.sortBy(_._3)
            t = k.map(_._3)
            k
        }   
     }
Run Code Online (Sandbox Code Playgroud)

先感谢您!

Ano*_*sse 6

一种相当简单且令人惊讶的快速方法是使用稳定的排序算法,首先按第一个组件排序,然后按第二个组件排序,然后排序第三个组件.由于您按第三个组件排序,因此这将占主导地位.使用稳定排序时,最后一个组件中绑定的对象将按前一个排序:

Sorting.stableSort(k, (x, y) => x._1 < y._1)
Sorting.stableSort(k, (x, y) => x._2 < y._2)
Sorting.stableSort(k, (x, y) => x._3 < y._3)
Run Code Online (Sandbox Code Playgroud)

或者等价(但可能更昂贵,因为它构建了一系列键):

Sorting.stableSort(k, x => x._1)
Sorting.stableSort(k, x => x._2)
Sorting.stableSort(k, x => x._3)
Run Code Online (Sandbox Code Playgroud)

(假设Seq.sortBy不稳定.)

可替换地(这是更经典的和明显的方法),写一个比较器(Ordering使用第三组分)如果不同,则第二,如果不同,最后的第一个.这可能不是非常"狡猾",但它是恕我直言,非常干净,可以理解:

val result = intOrdering.compare(x._3, y._3)
if (result == 0) result = intOrdering.compare(x._2, y._2)
if (result == 0) result = intOrdering.compare(x._1, y._1)
result
Run Code Online (Sandbox Code Playgroud)

再次,你也可以使用一个键功能(但这将需要2倍的内存):

k.sortBy(x => (x._3, x._2, x._1))
Run Code Online (Sandbox Code Playgroud)


jim*_*s17 5

看起来

k.sortBy(x => (x._3 , x._2))
Run Code Online (Sandbox Code Playgroud)

工作和回报

List[(Int, Int, Int)] = List((2,1,3), (4,2,6), (6,3,9), (4,7,9), (6,7,11),
          (8,4,12), (10,5,15), (12,1,17), (12,6,18), (8,14,18), (6,17,19))
Run Code Online (Sandbox Code Playgroud)

这也适用于(12,6,18),(8,14,18)