2016-05-15 1 views
1

У меня есть метод, который возвращает количество объектов с более высоким значением, чем среднее значение всех объектов в пределах ArrayList.Каков наилучший способ найти среднее значение объектов, хранящихся в arraylist?

Объект «Пользователь» имеет целочисленное значение, хранящееся в его классе (уровне).

Мой метод работает, но мне интересно, есть ли лучший способ найти среднее значение всех значений объекта?

public int bestPlayers() { 

    ArrayList<User> players = new ArrayList<User>(); 
    int bestPlayers = 0; 
    int totalPlayerLevel = 0; 
    double averageLevel = 0; 

    for (int i = 0; i < players.size(); i++) { 
     totalPlayerLevel += players.get(i).level; 
    } 

    averageLevel = totalPlayerLevel/players.size(); 

    for (int i = 0; i < players.size(); i++) { 
     if (players.get(i).level > averageLevel) { 
      bestPlayers++; 
     } 
    } 

    return bestPlayers; 
} 
+4

'averageLevel = (double) totalPlayerLevel/players.size;' для лучшей точности. – MikeCAT

+0

http://stackoverflow.com/questions/12002332/how-to-manipulate-arrays-find-the-average-beginner-java – Idos

+0

'averageLevel = (double) totalPlayerLevel/players.size();' может быть лучше, потому что свойство 'java.util.ArrayList.size' является закрытым. – MikeCAT

ответ

6

Java 8 обеспечивает лучший способ, с помощью IntStream#average():.

double average = players.stream() 
         .mapToInt(p -> p.level) 
         .average() 
         .orElse(0); 

Затем вывести число "выше среднего" игроков:

return (int) players.stream() 
        .filter(p -> p.level > average) 
        .count(); 
+0

Если вы хотите показать поток, способный сделать это, покажите вторую половину, то есть подсчитайте «лучших игроков». Сейчас это неполный ответ. – Andreas

+0

@Andreas Вопрос только спросил о лучшем способе поиска среднего, но я обновил его. – 4castle

+0

Не нужно "mapToInt()'. Просто выполните 'filter (p -> p.level> average)'. – Andreas

2

Ваш код работает в O(n), поскольку вы путешествуете через массив в два раза. Ну, так как вам приходится вычислять среднее значение, это означает, что вы должны путешествовать хотя бы один раз, поэтому нет возможности для производительности быстрее, чем O(n).

Вторая вещь, которую вы делаете, вы должны подсчитывать игроков с уровнем выше среднего. Только ускорение здесь может быть, если вы отсортировали массив (раньше, а не вычисляли сейчас, так как его O(nlogn), тогда вы можете найти первый с более высоким уровнем, а затем средним и рассчитать количество остальных. Это будет стоить O(logn), но его производительность по-прежнему O(n), так как вы вычислили средний

+0

Это ваш очень длинный способ ответа * Нет * на вопрос * «Есть ли лучший способ?» *? – Andreas

+0

просто объясняет, почему нет :) –

+0

Этохорошо понять, я ценю объяснение! – girthquake