我有一个整数元组列表
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)
先感谢您!
一种相当简单且令人惊讶的快速方法是使用稳定的排序算法,首先按第一个组件排序,然后按第二个组件排序,然后排序第三个组件.由于您按第三个组件排序,因此这将占主导地位.使用稳定排序时,最后一个组件中绑定的对象将按前一个排序:
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)
看起来
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)
| 归档时间: |
|
| 查看次数: |
1831 次 |
| 最近记录: |