Перевод кода Ruby на Java - PullRequest
       19

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

2 голосов
/ 23 октября 2010

Я никогда не использовал 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 Ответ

3 голосов
/ 23 октября 2010

Код выполняет следующие действия:

Он устанавливает постоянную с именем 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 }

Это устанавливает сумму, чтобы быть суммой всех элементов в posterior.

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

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

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

...