我试图对一组对象进行排序。 当我尝试使用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))
答案 0 :(得分:9)
你的问题在你的谓词中。考虑(101,A,澳大利亚)与(102,A,缅甸)的比较:您的排序函数表示当两者第二个元素和第一个元素更大 - 即A时
同样,如果你扭转了comaprison,是(102,A,缅甸)&lt; (101,A,澳大利亚)?在这里你需要A.
因此,排序算法会发现这些元素都不比另一个元素小,所以它们对于排序目的是相同的,并且使用稳定排序,将它们保留为原始顺序。尝试在你的inoput中反转这两个元素,看看它们按照你输入的顺序出现在结果中。
您需要的排序谓词是:(x._2&lt; y._2 ||(x._2 == y._2&amp;&amp; x._1&gt; y。 1))) - 这个将首先比较元组的第二个元素,因此(,A,)将始终小于(,B,_),但是当第二个元素相等时,它将会表示小于第一个元素较大的情况。
此处的关键是,当主要比较(x._2与y._2)相等时,您希望仅使用辅助比较(x._1&gt; y._1) 。
答案 1 :(得分:5)
使用sortBy
,
res.sortBy(t => (t._2, -t._1))
首先按元组中的第二项按升序排序,如果相等,则按第一项按降序排序。注意我们使用否定(减去这里)来恢复默认排序。