我正在尝试对一组对象进行排序.当我尝试使用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))
Run Code Online (Sandbox Code Playgroud)
基本上我试图排序第二元组,并根据结果我正在排序第一元组.我得到以下结果,但没有正确排序.我知道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))
Run Code Online (Sandbox Code Playgroud)
你的问题在你的谓词中.考虑(101,A,澳洲)与比较(102,A,缅甸):你的排序功能说,第一个元组是小的时候都第二个元素是更小的和第一个元素是较大的-即当A
同样,如果你扭转了comaprison,是(102,A,缅甸)<(101,A,澳大利亚)?在这里你需要A.
因此,排序算法会看到这些元素都不比另一个元素小,因此它们对于排序目的是相同的,并且使用稳定排序,将它们保留为原始顺序.尝试在你的inoput中反转这两个元素,看看它们按照你输入的顺序出现在结果中.
你需要的排序谓词是:(x._2 <y._2 ||(x._2 == y._2 && x._1> y.1 ))) - 这将首先比较元组的第二个元素,所以(,A,)将始终小于(,B,_),但是当第二个元素相等时,它将指示小于第一个元素更大的情况.
这里的关键是,只有当主要比较(x._2与y._2)相等时,才想使用二次比较(x._1> y._1).
一种简单的方法sortBy,
res.sortBy(t => (t._2, -t._1))
Run Code Online (Sandbox Code Playgroud)
它首先按元组中的第二项按升序排序,如果相等,则按第一项中的降序排序。请注意,我们使用负号(此处为负号)来还原默认顺序。