通过第一个元素反向,第二个元素常规对元组进行排序

may*_*yap 9 sorting scala

我有形式的元组(Boolean, Int, String).

我想定义Ordering,按以下顺序对元组进行排序:

  1. 布尔 - 逆序

  2. Int - 逆序

  3. 字符串 - 常规订单

例:

对于元组:Array((false, 8, "zz"), (false,3, "bb"), (true, 5, "cc"),(false, 3,"dd")).

订购应该是:

(true, 5, "cc")

(false, 8,"zz")

(false, 3, "bb")

(false, 3, "dd")
Run Code Online (Sandbox Code Playgroud)

我找不到一种方法来定义一些反向排序和一些常规.

Rég*_*les 12

在这种特定情况下的直接解决方案是sortBy在元组上使用,在运行中进行修改以"反转"第一和第二元素,以便最终排序顺序:

val a = Array((false, 8, "zz"), (false,3, "bb"), (true, 5, "cc"),(false, 3,"dd"))
a.sortBy{ case (x,y,z) => (!x, -y, z) }
Run Code Online (Sandbox Code Playgroud)

对于不能轻易"反转"某个值的情况(比如说这是一个参考对象,并且你对它们有一个不透明的排序),你可以改为使用 sorted并明确地传递一个排序,这个排序构造成颠倒第一个顺序.和第二个元素(您可以Ordering.reverse用来反转排序):

val myOrdering: Ordering[(Boolean, Int, String)] = Ordering.Tuple3(Ordering.Boolean.reverse, Ordering.Int.reverse, Ordering.String)
a.sorted(myOrdering)
Run Code Online (Sandbox Code Playgroud)