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

标签 scala sorting

我正在尝试对一组对象进行排序。
当我尝试使用 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/

相关文章:

javascript - 为什么这个 JavaScript 函数被调用两次?

scala - 在没有错误状态的情况下处理 iteratee 库中的异常

scala - 如何在 "package"之前运行 'test"

scala - 你如何在 Play 2.0.x 中获得请求的大小?

java - 递归插入排序列表

php - 如何在 Zend Action Helper(或类中)中使用 uasort()?

python - 排列列表中的元素,使相似的元素相距最远

sorting - 冒泡排序和选择排序

scala - sbt 脚本插件失败,因为未解决对发布交叉编译的 scala 版本的依赖

scala - 结合 `OptionT` 和 `EitherT` 来处理 `Future[Either[Error, Option[T]]]`