2015-06-14 2 views
1

Я пытаюсь написать код, который принимает любое количество записей и сохраняет его в ArrayList с учетом определенного условия. То, что я не могу сделать, это найти среднее значение, хранящееся в ArrayList. Вот код, написанный до сих пор:Попытка рассчитать среднее значение в ArrayList

import java.util.ArrayList; 
import java.util.Scanner; 

public class App { 
    private ArrayList<Integer> temp; 
    private int t; 
    private int count = 0; 

    public void main() { 
     Scanner input = new Scanner(System.in); 
     temp = new ArrayList<>(); 
     System.out.println("Enter temperatures: "); 
     do { 
      t = input.nextInt(); 
      if (t == -99) { 
       System.out.println("Program Terminating.."); 
       break; 
      } else { 
       temp.add(t); 
      } 
     } while (t != -99); 
     for (int i = 0; i < temp.size(); i++) { 
      if (temp.get(i) > 40) { 
       count++; 
      } 

     } 
     System.out.println(count); 

    } 
} 
+2

с Java 8 вы можете просто 'list.stream() mapToInt (Integer :: intValue) .sum()/list.size() '. – Maroun

+0

Благодарим вас за ответ. Кажется, я не понимаю этого. Не могли бы вы объяснить это по-другому? Очень признателен. –

+0

ОК. Итак, как бы вы вычислили среднее значение, с ручкой и бумагой. Или с вашим мозгом? В среднем ли счет? Если нет, то почему вы считаете элементы? Предположим, что список содержит 2, 4, 5, 6 и 8. –

ответ

2

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

В традиционной манере, вы можете использовать усовершенствованный для со счетчиком, чтобы получить все значений больше, чем 40, а в среднем тех ...

double sum = 0; 
for(Integer i : temp) { 
    if(i > 40) { 
     sum += i; 
     count++; 
    } 
} 

if(count != 0) { // avoid divide-by-zero error here 
    System.out.println(sum/count); 
} 

... или с Java 8, вы могут использовать потоки, отфильтровать те, которые меньше, чем 40, и получить среднее, как двойной вместо:.

System.out.println(temp.stream() 
         .filter(x -> x > 40) 
         .mapToInt(Integer::intValue) 
         .average() 
         .getAsDouble()); 
+0

Эй, большое вам спасибо за это решение. Условие, которое я пытаюсь реализовать в этом коде, - это A) Мне нужен счетчик температур более 40 и B) Мне нужно среднее значение всех введенных температур, включая те, которые ниже 40. –

+0

Код не должен быть сложным расширяться в соответствии с этой потребностью; это более-менее пример. Я оставляю остальных в качестве упражнения для читателя. – Makoto

+0

Большое вам спасибо! Изменено, и это сработало. –

0
long total =0; 
    for(int i=0;i < temp.size(); i++){ 
    if(temp.get(i) > 40){ 
     count++; 
     total+=temp.get(i); 
    } 
    } 

    double mean=0; 
    if(count!=0) 
     mean = total/count; 
+0

Это вернет 1 для среднего значения 1, 2, 2. –

+0

Поскольку 'total' является длинным,' count' также будет увеличен до конца, и ваш результат будет эквивалентен целочисленному делению; т. е. десятичная часть усечена. – Makoto

Смежные вопросы