【问题标题】:Scala 2D array sorting by specified columnScala 2D数组按指定列排序
【发布时间】:2014-04-07 12:47:04
【问题描述】:

给定任何二维数组,例如,

val in = Array( Array(59, 45, 32), 
                Array(20, 88, 5), 
                Array(49, 72, 89))

想按第三列排序,这样

val out = Array( Array(20, 88, 5),
                 Array(59, 45, 32),                       
                 Array(49, 72, 89))

非常感谢。

【问题讨论】:

    标签: arrays scala sorting matrix


    【解决方案1】:

    这应该可以,但如果您的数组大小小于 3,则会失败:

    scala> in.sortBy(_(2))
    

    输出:

    res0: Array[Array[Int]] = Array(Array(20, 88, 5), Array(59, 45, 32), Array(49, 72, 89))
    

    您也可以像这样使这个故障安全:

    in.sortBy {
      case arr @ Array(_) if arr.size >= 3 => arr(2)
      case arr => Int.MaxValue // or any other value. Using MaxValue will make the invalid arrays be last ones
    }
    

    【讨论】:

    • 你的第二个解决方案可以写成scala> in.sortBy { case Array(_, _, x, _*) => x; case _ => Int.MaxValue }
    • 谢谢。我认为有几种方法可以做同样的事情,我只是选择了我来的第一个:)
    • 非常感谢,这很有帮助。
    【解决方案2】:
    in.sortWith(_(2) < _(2))
    

    将使用数组的第三个元素对数组进行排序。

    【讨论】:

    • 非常感谢分享这种方法。
    【解决方案3】:

    如果你的数组是 Array[Array[Int]],你只需要使用yourArray.sortBy(_(3))。 3 是您的字段索引,您要根据此列对其进行排序。

    但是,如果你的数组不是 Array[Array[Int]],你不能直接使用 sortBy。最好使用从scala.util.Sorting导入的Sorting

    这是我的代码。

    import scala.util.Sorting
    
    Sorting.quickSort(yourArray)(new Ordering[Array[String]] {
      def compare(x: Array[String], y: Array[String]) = {
        x(3) compare y(3)
      }
    })
    

    我的数组是 Array[Array[String]],x(3) 是您要比较的一个字段。当然,如果要逆向排序,只需要用y(3) compare x(3)替换x(3) compare y(3)即可。

    如果你的数组是其他类型,你只需要用你的类型替换Array[String]

    【讨论】:

      猜你喜欢
      • 2013-03-14
      • 2017-03-21
      • 2021-05-18
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多