将Ruby代码转换为Java

时间:2010-10-23 12:31:55

标签: java ruby rating bayesian

我从未使用过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;
}

1 个答案:

答案 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](其中ifor的索引 - 循环)到变量tmp,在循环之前设置为0。然后,您将tmp投射到float并将其除以sum