Перевод кода Ruby на Java


Я никогда не использовал 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;
}
1 2

1 ответ:

Код делает следующие вещи:

Он установил константу с именем 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, где каждый элемент является сумма соответствующего элемента в голосах и соответствующего элемента в предыдущих (т. е. 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

Этот бит умножает каждый элемент в posterior на его индекс плюс один,а затем суммирует его. Результат преобразуется в float и затем делится на sum.

В java вы бы перебирали posterior с for-loop (не foreach) и в каждой итерации добавляли (i + 1) * posterior[i] (где i - индекс for - цикл) в переменную tmp, которую вы устанавливаете в 0 перед циклом. Затем вы бросите tmp в float и разделите его на sum.