迭代一个ArrayList按对象属性计数

时间:2017-12-01 02:29:37

标签: java arraylist enums enumeration

我已经初始化了ArrayList个产品。 Product构造函数是:

public Product(String number, String type, double rentalDeposit, double rentalPrice, double lateFee, double buyPrice, int maxDuration)

type由枚举确定:

protected enum productType {Basket, BabySeat, Helmet, Headlight, Bell};

我使用type方法传递toString进行枚举。我需要遍历我所拥有的ArrayList<Product>(由shop.getInventory()给出)并计算每个type的数量,即type {{1}的数量}},BasketBabySeat

Helmet类有一个返回字符串的Product方法。

getType()

我已尝试使用for (Product.productType product : Product.productType.values()) { int occurences = Collections.frequency(shop.getInventory(), product.toString()); } ,但它一直返回Collections.frequency,我不确定原因。

是否有另一种方法可以在不使用大量0语句的情况下迭代并查找此数量?

2 个答案:

答案 0 :(得分:0)

shop.getInventory()我假设其类型为Collection<Product>。您可以定义产品,以便.equals(Product)检查产品内部类型的相等性,甚至更简单地shop.getInventory().stream().filter(item -> product.toString().equals(item.getType())).count()。 (替换item.getType()然后从Product中提取类型字段,例如item.type等。)

答案 1 :(得分:0)

计算列表中与某些条件相对应的项目的简单方法是使用Collectors.groupingByCollectors.counting。如下所示:

Map<ProductType,Long> counts = products.stream()
    .collect(groupingBy(Product::getType, counting()));

如果您不熟悉流,则此声明可以理解为“将列表转换为产品流,按产品类型对产品进行分组,然后计算每个组创建从类型到计数的映射。 “