gpt4 book ai didi

scala - 使用 scala sortWith 函数对对象中的多个字段进行排序

转载 作者:行者123 更新时间:2023-12-04 22:53:21 25 4
gpt4 key购买 nike

我正在尝试对一组对象进行排序。
当我尝试使用 sortWith 函数只对对象中的一个字段进行排序时,它工作得很好。
当多个字段被排序时,它就会搞砸。

例如。

scala> val res = branches.collect.toList
res: Array[(String, String, String)] = Array((109,A,Australia), (101,A,Australia), (102,A,Myanmar), (103,B,Australia), (104,A,Europe), (105,B,US), (106,B,Myanmar), (107,C,Australia), (108,A,Canada))

scala> val a = res.sortWith((x,y) => (x._2 < y._2 && x._1 > y._1))

基本上我试图对第二个元组进行排序,并根据结果对第一个元组进行排序。
我得到以下结果,它没有正确排序。
我知道使用 sortBy 函数也可以实现同样的效果。
但我想了解 sortWith 是如何工作的。
scala> val a = res.sortWith((x,y) => (x._2 < y._2 && x._1 > y._1))
a: Array[(String, String, String)] = Array((109,A,Australia), (107,C,Australia), (101,A,Australia), (102,A,Myanmar), (104,A,Europe), (108,A,Canada), (103,B,Australia), (105,B,US), (106,B,Myanmar))

最佳答案

你的问题出在你的谓词中。考虑 (101,A, Australia) 与 (102,A, Myanmar) 的比较:您的排序函数表示,当第二个元素较小且第一个元素较大时,第一个元组较小 - 即当 A

同样,如果你反转comaprison,是(102,A,Myanmar) < (101,A,Australia)?在这里你需要一个

因此,排序算法看到这些元素中的任何一个都不小于另一个,因此出于排序目的它们是相等的,并且使用稳定排序将它们保留在原始顺序中。尝试反转输入中的这两个元素,并查看它们以您放入的顺序出现在结果中。

您需要的排序谓词是: (x._2 < y._2 ||(x._2 == y._2 && x._1 > y.1))) - 这将首先比较元组的第二个元素,所以(,A,) 将始终小于 (,B,_),但是当第二个元素相等时,它将指示小于第一个元素较大的情况。

这里的关键是,您只想在主要比较(x._2 与 y._2)相等时才使用次要比较(x._1>y._1)。

关于scala - 使用 scala sortWith 函数对对象中的多个字段进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38178967/

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