gpt4 book ai didi

scala - 如何在Scala中对整数元组列表进行排序

转载 作者:行者123 更新时间:2023-12-04 22:20:16 26 4
gpt4 key购买 nike

给定一个整数元组列表:

List[(Int, Int, Int)] =  List((2,1,3), (4,2,6),...)
我想按它们的第三个组件对它们进行排序,但是如果两个元组具有相同的第三个组件,那么我想按它们的第二个组件对它们进行排序。例如,我想要 (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
}
}
先感谢您!

最佳答案

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

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)

或等效(但可能更昂贵,因为它构建了一系列键):
Sorting.stableSort(k, x => x._1)
Sorting.stableSort(k, x => x._2)
Sorting.stableSort(k, x => x._3)

(假设 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

同样,您也可以使用键功能(但这需要 2 倍的内存):
k.sortBy(x => (x._3, x._2, x._1))

关于scala - 如何在Scala中对整数元组列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27659589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com