我正在将一些代码从 Ruby 转换为 Scala。问题是我一生中从未编写过 Ruby 程序。一切顺利,但现在我遇到了两行我不明白的地方。 如何将最后 2 行 Ruby 代码转换为 Scala?
num_obs = pop.first[:objectives].size
num_obs.times do |i|
min = pop.min{|x,y| x[:objectives][i]<=>y[:objectives][i]}
max = pop.max{|x,y| x[:objectives][i]<=>y[:objectives][i]}
/* do sth. with min and max */
end
pop 是 Vector[Map[String, Any]]
最佳答案
整体|x,y| f(x) <=> f(y)
事情似乎只是比较x
和 y
通过一些属性(property)f
, 和 <=>
返回 -1, 0, 1
.如果不提供 compare
,同样的事情可以更容易表达。具有返回值的方法 -1, 0, 1
,我们简单地通过 f
进行比较.在 Scala 中,这类似于:
val pop: Vector[Map[String, Any]] = ???
val num_obs: Int = ???
for (i <- 0 until num_obs) {
val min = pop.minBy(_("objectives").asInstanceOf[Vector[Int]](i))
val max = pop.maxBy(_("objectives").asInstanceOf[Vector[Int]](i))
/* do sth. with min and max */
}
请注意,我已经替换了符号 :objectives
通过字符串,即使 Scala 也有 Symbol
-type(对应的符号为 'objectives
)。我还假设 map 中的值类似于整数向量(否则使用 i
进行索引没有任何意义)。
关于Ruby 到 Scala 的代码转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50311405/