Ruby 到 Scala 代码翻译 - 在 Scala 中排序

Ruby to Scala code translation - Sorting in Scala

我正在将一些代码从 Ruby 转换为 Scala。问题是我一生中从未编程过 Ruby。一切顺利,但现在我到达了一条我不知道的线,因为我是 Scala 的新手,我不了解排序机制。 所以我想将这个 ruby 行翻译成 scala:

fronts[last_front].sort! {|x,y| crowded_comparison_operator(x,y)}

frontsVector[Vector[Map[String, Any]]]

last_front 是一个 Int

crowded_comparison_operator(x,y) returns -1, 0 或 1, x 和 y 为 Map[String, Any]

标准 Scala 集合有两种可能性:

  • crowded_comparison_operator-1, 0, 1输出转换成一个布尔值,告诉你第一个元素是否小于第二个元素,然后使用sortWith
  • 定义一个新的 Ordering,将其显式传递给 sorted 方法。

sortWith方法

第一个元素小于第二个元素当且仅当crowded_comparison_operator returns -1,所以你可以这样做:

fronts(last_front).sortWith{ (x, y) => crowded_comparison_operator(x, y) < 0 }

正在为 sorted

定义 Ordering

sorted 方法采用隐式 Ordering 参数。您可以定义自己的自定义顺序,并显式传递它:

import scala.math.Ordering

fronts(last_front).sorted(new Ordering[Vector[Map[String, Any]]] {
  def compare(
    x: Vector[Map[String, Any]], 
    y: Vector[Map[String, Any]]
  ): Int = crowded_comparison_operator(x, y)
})

或更短,scala 版本支持 SAM(自 2.11.5 起,如果我没记错的话):

fronts(last_front).sorted(
  (x: Vector[Map[String, Any], y: Vector[Map[String, Any]]) => 
    crowded_comparison_operator(x, y)
)

请注意,正如@mikej 指出的那样,Ruby 的 sort! 对数组进行就地排序。这不适用于不可变向量,因此您必须相应地调整代码。