我从未使用过ruby但需要将此代码翻译为java。
任何人都可以帮助我。
这是Ruby中的代码。
DEFAULT_PRIOR = [2, 2, 2, 2, 2]
## input is a five-element array of integers
## output is a score between 1.0 and 5.0
def score votes, prior=DEFAULT_PRIOR
posterior = votes.zip(prior).map { |a, b| a + b }
sum = posterior.inject { |a, b| a + b }
posterior.
map.with_index { |v, i| (i + 1) * v }.
inject { |a, b| a + b }.
to_f / sum
end
我是从这里获得的,所以也许可以找到一些线索。它关于计算平均值
How to rank products based on user input
这是解决方案。如果有人需要它
static final int[] DEFAULT_PRIOR = {2, 2, 2, 2, 2};
static float score(int[] votes) {
return score(votes, DEFAULT_PRIOR);
}
private static float score(int[] votes, int[] prior) {
int[] posterior = new int[votes.length];
for (int i = 0; i < votes.length; i++) {
posterior[i] = votes[i] + prior[i];
}
int sum = 0;
for (int i = 0; i < posterior.length; i++) {
sum = sum + posterior[i];
}
float sumPlusOne = 0;
for (int i = 0; i < posterior.length; i++) {
sumPlusOne = sumPlusOne + (posterior[i] * (i + 1));
}
return sumPlusOne / sum;
}
答案 0 :(得分:3)
代码执行以下操作:
它将一个名为DEFAULT_PRIOR
的常量(java等效的静态最终变量)设置为包含数字2的数组五次。在java中:
static final int[] DEFAULT_PRIOR = {2,2,2,2,2};
它定义了一个名为score的双参数方法,其中第二个参数默认为DEFAULT_PRIOR
。在java中,这可以通过重载来实现:
float score(int[] votes) {
return score(votes, DEFAULT_PRIOR);
}
在得分方法中,它执行以下操作:
posterior = votes.zip(prior).map { |a, b| a + b }
这会创建一个数组后验,其中每个元素是投票中相应元素与先前相应元素(即posterior[i] = votes[i] + prior[i]
)的总和。
sum = posterior.inject { |a, b| a + b }
这将总和设置为posterior
中所有元素的总和。
posterior.
map.with_index { |v, i| (i + 1) * v }.
inject { |a, b| a + b }.
to_f / sum
这个位将后面的每个元素与其索引加1相乘,然后对其求和。结果将转换为浮点数,然后除以sum
。
在java中,你将使用for
- 循环(不是foreach)迭代后验,并在每次迭代中添加(i + 1) * posterior[i]
(其中i
是for
的索引 - 循环)到变量tmp
,在循环之前设置为0。然后,您将tmp
投射到float
并将其除以sum
。