Sort tuples by first element reverse, second element regular

后端 未结 2 792
孤城傲影
孤城傲影 2021-02-06 00:12

I have tuples of the form (Boolean, Int, String).

I want to define Ordering which sorts the tuples in the following order:

  1. Boolean - revers

2条回答
  •  情深已故
    2021-02-06 01:04

    The straight forward solution in this specific case is to use sortBy on the tuples, modified on the fly to "invert" the first and second elements so that in the end the ordering is reversed:

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

    For cases when you cannot easily "invert" a value (say that this is a reference object and you've got an opaque ordering on them), you can instead use sorted and explicitly pass an ordering that is constructed to invert the order on the first and second elements (you can use Ordering.reverse to reverse an ordering):

    val myOrdering: Ordering[(Boolean, Int, String)] = Ordering.Tuple3(Ordering.Boolean.reverse, Ordering.Int.reverse, Ordering.String)
    a.sorted(myOrdering)
    

提交回复
热议问题