2

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

我从这里得到它,所以也许可以在那里找到一些线索。关于计算平均值

如何根据用户输入对产品进行排名

这就是解决方案。万一有人需要

    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;
}
4

1 回答 1

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);
}

在 score 方法中,它执行以下操作:

posterior = votes.zip(prior).map { |a, b| a + b }

这将创建一个后验数组,其中每个元素是投票中对应元素和先验中对应元素的总和(即posterior[i] = votes[i] + prior[i])。

sum = posterior.inject { |a, b| a + b }

这将 sum 设置为 中所有元素的总和posterior

posterior.
map.with_index { |v, i| (i + 1) * v }.
inject { |a, b| a + b }.
to_f / sum

该位将后验中的每个元素与其索引加一相乘,然后将其相加。结果转换为浮点数,然后除以sum

在java中,您将使用for-loop(不是foreach)迭代后验,并在每次迭代中将(-loop的索引在(i + 1) * posterior[i]哪里)添加到一个变量,您在循环之前将其设置为0。然后,您将转换为并将其除以。ifortmptmpfloatsum

于 2010-10-23T12:42:22.750 回答