【问题标题】:What's the best way to find the average value of objects stored in an arraylist?找到存储在数组列表中的对象的平均值的最佳方法是什么?
【发布时间】:2016-05-15 06:46:40
【问题描述】:

我有一个方法可以返回比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;
}

【问题讨论】:

  • averageLevel = (double)totalPlayerLevel / players.size; 以获得更好的精度。
  • averageLevel = (double)totalPlayerLevel / players.size(); 可能会更好,因为属性 java.util.ArrayList.size 是私有的。
  • levelpublic 有什么原因吗?
  • @MikeCAT 实际上是另一种方式。将averageLevel 更改为int,因为无论如何您都要将它与int level 字段进行比较。而且由于是&gt;,而不是&gt;=,所以整数除法的截断是可以的。

标签: java arraylist average


【解决方案1】:

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();

【讨论】:

  • 如果你想展示一个流的方式,也展示下半部分,即计算“最佳球员”。现在这是一个不完整的答案。
  • @Andreas 这个问题只问了一个更好的方法来找到平均值,但我已经更新了。
  • 不需要mapToInt()。只需filter(p -&gt; p.level &gt; average)
【解决方案2】:

您的代码在O(n) 中有效,因为您两次遍历数组。好吧,由于您必须计算平均值,这意味着您必须至少旅行一次,因此没有比O(n) 更快的性能选项。

你要做的第二件事,你必须计算等级高于平均水平的玩家。如果您已经对数组进行了排序(之前有,现在不计算,因为它的O(nlogn),那么您可以找到第一个更高级别的数组,然后平均计算其余数组的数量。这将花费O(logn),但是它的性能仍然是O(n),因为你计算了平均值。

【讨论】:

  • 对于“有更好的方法吗?”,这是你对No的冗长回答吗?
  • 只是解释为什么不:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 2020-11-23
相关资源
最近更新 更多