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)}
fronts
是 Vector[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!
对数组进行就地排序。这不适用于不可变向量,因此您必须相应地调整代码。
我正在将一些代码从 Ruby 转换为 Scala。问题是我一生中从未编程过 Ruby。一切顺利,但现在我到达了一条我不知道的线,因为我是 Scala 的新手,我不了解排序机制。 所以我想将这个 ruby 行翻译成 scala:
fronts[last_front].sort! {|x,y| crowded_comparison_operator(x,y)}
fronts
是 Vector[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!
对数组进行就地排序。这不适用于不可变向量,因此您必须相应地调整代码。