我正在把一些代码从ruby转换成scala。问题是我这辈子从来没有编程过Ruby进展顺利,但现在我遇到了两条我不明白的线。
如何将最后两行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
,而f
返回<=>
如果我们不提供返回值-1, 0, 1
的compare
方法,而只通过-1, 0, 1
进行比较,同样的事情可以更容易地表达出来。在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 */
}
注意,我已经用字符串替换了symbols
f
,尽管Scala也有:objectives
-type(对应的符号是Symbol
)我还假设图中的值类似于整数向量(索引为'objectives
没有任何意义)。