Перевод кода 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 ответ:
Код делает следующие вещи:
Он установил константу с именем
DEFAULT_PRIOR
(эквивалент java будет статической конечной переменной) в массив, содержащий число 2 пять раз. На языке java:Он определяет метод с двумя аргументами score, где второй аргумент по умолчанию равенstatic final int[] DEFAULT_PRIOR = {2,2,2,2,2};
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
.