Посчитать среднее каждого списка из arrayList типа HashSet - PullRequest
0 голосов
/ 01 мая 2018

У меня есть ArrayList типа HashSet

ArrayList<HashSet<E>> array = new ArrayList<>();

что каждый ключ array.get(0) имеет список типа HashSet

array.get(0) = [1895, 1959, 2023, 2087, 1960]

array.get(1) = [2277, 2213, 2278, 2214]

Теперь я хочу взять все списки у массива и добавить их, затем взять среднее значение.

это означает, например,

int sum = 0, avg = 0;

for(int i = 0 ; i < array.size() ; i++){
    for(int j = 0 ; j < array.get(i).size() ; i++){
        sum += array.get(i).get(j);  // this is of course wrong
    }

    avg = sum / array.get(i).size();
    System.out.println("avg of list " + i + "is : " + avg);
}

как это сделать Я предлагаю создать еще один массив целых чисел, затем добавить числа из array.get(0), затем подсчитать среднее значение, затем очистить массив и после этого добавить числа из array.get(1), затем посчитать их среднее значение и т. Д.

Ответы [ 4 ]

0 голосов
/ 01 мая 2018

Если вы используете Java 8+, может быть лучше:

array.stream()
     .mapToDouble(set -> 
         set.stream().mapToInt(Integer::intValue).average().orElse(0)
     )
     .forEach(System.out::println);

Выходы

1984.8
2245.5

В вашем решении вы пытаетесь получить элемент из HashSet с get(index), но это не правильно, вместо этого вы должны использовать Iterator, чтобы взглянуть на этот QA, Получение элемента из Set , или вы можете использовать for (Integer e : array.get(i)) так:

for (int i = 0; i < array.size(); i++) {
    int sum = 0;
    for (Integer t : array.get(i)) {
        sum += t;
    }
    double avg = sum / array.get(i).size();
    System.out.println("avg of list " + i + "is : " + avg);
}

Обратите внимание, что переменные sum и avg должны быть переназначены на 0 в каждой итерации, иначе вы получите неверный результат.

0 голосов
/ 01 мая 2018

Почему бы не использовать для каждого цикла, чтобы сделать его более понятным?

int sum = 0, avg = 0, count = 0;
for (HashSet<Integer> set: array) {
   for (Integer element: set) {
       sum += element;
       count++;
   }
}
avg = sum/count;
0 голосов
/ 01 мая 2018

Что именно типа E?

Если он имеет тип Integer, он будет выглядеть следующим образом:

    for(int i = 0; i < array.size(); i++)
    {
        int sum = 0;
        for(Integer e : array.get(i))
        {
            sum += e;
        }
        double avg = sum / array.get(i).size();
        System.out.println("Average of list" + i + "is : " + avg);
    }
0 голосов
/ 01 мая 2018

Как насчет этого:

for(int i = 0 ; i < array.size() ; i++){
    int sum = 0, avg = 0;
    for(E e : array.get(i)){
        sum += e;
    }
    avg = sum / array.get(i).size();
    System.out.println("avg of list " + i + "is : " + avg); }
}
...