【问题标题】:Sort tuples by first element reverse, second element regular按第一个元素反向排序元组,第二个元素正则
【发布时间】:2015-06-03 05:10:46
【问题描述】:

我有 (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")

我找不到定义一些反向排序和一些常规排序的方法。

【问题讨论】:

    标签: scala sorting


    【解决方案1】:

    在这种特定情况下,直接的解决方案是在元组上使用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) }
    

    如果您无法轻松“反转”一个值(假设这是一个引用对象并且您对它们进行了不透明的排序),您可以改用 sorted 并显式传递构造为反转第一个和第二个元素的顺序的排序(您可以使用 Ordering.reverse 反转排序):

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

    【讨论】:

      【解决方案2】:

      你可以做这样的事情。

      case class myTuple(t: (Boolean, Int, String)) extends Ordered[myTuple] {
          def compare(that: myTuple):Int = {
              val (x,y,z) =t
              val (x1,y1,z1) = that.t
              if (x.compare(x1) != 0) x.compare(x1)
              else {
                if (y.compare(y1) != 0) if (y.compare(y1) == 1) 0 else 1
                else z.compareTo(z1)
              }
         }
      }
      
      val myList = Array((false, 8, "zz"), (false,3, "bb"), (true, 5, "cc"),(false, 3,"dd"))
      
      implicit def tupleToBeordered(t: (Boolean, Int, String)) = new myTuple(t._1,t._2,t._3)
      
      myList.sorted
      

      【讨论】:

      • 它不起作用,因为没有任何地方创建 myTuple。你的转换 tupleToBeordered 永远不会被调用,myList 仍然是一个普通的 Array[(Boolean, Int, String)] 所以 myList.sorted 使用正常的排序。要使其正常工作,您需要先将 myList 转换为 myTuple 的某个集合,对其进行排序,然后再转换回元组集合。像myList.map(tupleToBeordered).sorted.map(_.t) 这样的东西。再说一次,它仍然不起作用,因为您的 compare 没有反转 x 上的比较。
      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2022-02-12
      相关资源
      最近更新 更多