【问题标题】:Java: Is there an easy way to get an average when I have a collection of objects?Java:当我有一组对象时,有没有一种简单的方法来获得平均值?
【发布时间】:2019-12-31 15:36:41
【问题描述】:

假设我有一个简单的对象:

public class Items {
    private static int 
        numItems,
        itemsInStock,
        itemsSold,
        //...
}

在代码的其他地方我有一个ArrayList<Items>

如果有一种简单的方法可以获得 numItems / ItemsInStock 等的平均值/中位数,而无需对对象的每个字段执行 for/each?

当前代码如下:

for (Items item: allItems) {
    if (item.field != null) { 
        temp += item.field;
    }
}
fieldAvg = temp / allItems.size();

【问题讨论】:

  • 我真的不明白这个问题,你的方法还不够简单吗?如果您想对所有字段快速执行此操作,只需复制并粘贴代码并替换 item.field 的每个提及。
  • 您可以流式传输和减少数据。
  • @HopefullyHelpful 在实际的生产代码中,我需要遍历大约 40 个字段,这会导致一些非常粗糙的重复代码。
  • 如果您的字段定义为static,您将不会得到您认为会得到的结果。删除 static 关键字。

标签: java collections average


【解决方案1】:

使用流可以说会更优雅:

double avg = allItems.stream().mapToInt(i -> i.itemsInStock).average().getAsDouble();
// Or any other field -------------------------^

【讨论】:

  • 对我来说看起来好多了,如果我有实施问题,我会回到这个。
【解决方案2】:

您可以使用 IntSummaryStatistics 及其所有功能 AverageSumMax、..:

int[] itemsInStock = allItems.stream().mapToInt(Items::getItemsInStock).toArray();

IntSummaryStatistics stat = IntStream.of(itemsInStock).summaryStatistics();

double average = stat.getAverage();
int max = stat.getMax();
int min = statistics.getMin();
long count = statistics.getCount();
long sum = statistics.getSum();
....

【讨论】:

    【解决方案3】:

    这是一个使用函数式方法的可能解决方案。

    import java.util.List;
    import java.util.function.ToIntFunction;
    
    public class Items {
        // it doesn't make sense for the members to be static
        private /* static */ int
            numItems,
            itemsInStock,
            itemsSold,
            //...
    
        private static double getAverage(List<Items> allItems, ToIntFunction<Items> getter) {
            // assumption: average should be a double
            // assumption: zero should be returned if no items passed
            return allItems.stream().mapToInt(getter).average().orElse(0.0);
        }
    
        private static void doAverageCalcs(List<Items> allItems) {
            double numItemsAverage = getAverage(allItems, t -> t.numItems);
            double itemsInStockAverage = getAverage(allItems, t -> t.itemsInStock);
            double itemsSoldAverage = getAverage(allItems, t -> t.itemsSold);
            // ...
    
            // do stuff with the averages
        }
    
        // the rest of the class' implementation goes here...
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2011-01-07
      • 2019-06-06
      相关资源
      最近更新 更多