2012-05-09 4 views
1

У меня есть ArrayList удваивается, и мне нужно найти среднее значение между всеми числами. Количество двойных экземпляров в arraylist не является постоянным, может быть 2, может быть 90 Я пытался часами, чтобы сам получить алгоритм, но не смог заставить его работать в любом случае.Найти среднее значение переменной переменной удвоения

Есть ли у вас какие-либо советы? или, может быть, вы можете связать меня с существующей библиотекой, чтобы получить это среднее значение?

Спасибо

ответ

0

Определение среднего является суммой всех значений, деленная на число значений. Переверните значения, добавьте их и разделите сумму на размер списка.

5

Создать sum переменную:

double sum = 0; 

Перейти через элементы в списке, используя для цикла:

for (double d : yourList) 

в каждой итерации, добавить sum текущее значение:

sum += d; 

после петли, чтобы найти среднее значение, разделите sum с числом элементов в списке:

double avg = sum/yourList.size(); 

Вот для всех, кто думает, что это было слишком просто ...

выше решение на самом деле не является совершенным. Если первая пара элементов в списке чрезвычайно велика и последние элементы малы, то sum += d может не иметь значения к концу из-за точности удвоений.

Решения для сортировки списка, прежде чем делать средние-вычисления:

Collections.sort(doublesList); 

Теперь маленькие элементы будут добавлены первыми, что делает, что они все подсчитываются настолько точно, насколько это возможно, и внести свой вклад в окончательном sum :-)

0

Если «среднее значение между всеми числами» означает среднее значение всех удвоений в вашем списке, вы можете просто добавить все удвои в свой список (с циклом) и разделить это число на число двойников в вашем списке.

0

Вы пробовали:

List<Double> list = new ArrayList<Double>(); 
...  
double countTotal = 0; 

for (Double number : list) 
{ 
    countTotal += number; 
} 

double average = countTotal/list.size(); 
0

Может быть, я не получил вопрос ... но это не что-то вроде этого?

double sum = 0.0; 
for (double element : list) { 
    sum += element; 
} 
double average = sum/list.size(); 
1

Если вы беспокоитесь о переполнении, когда суммируете весь список вместе, вы можете использовать текущее среднее значение. Поскольку он имеет больше операций, он будет медленнее, чем добавлять все вместе и делить один раз.

for (int x = 0; x < list.size(); x++) 
    average = (average/(x+1)) * (x) + list.get(x)/(x+1); 
+0

Это тоже не очень хорошо, когда речь идет о точности. – aioobe

2

Если вы любите потоки:

List<Number> list = Arrays.asList(number1, number2, number3, number4); 

// calculate the average 
double average = list.stream() 
        .mapToDouble(Number::doubleValue) 
        .average() 
        .getAsDouble(); 
Смежные вопросы