首页 > 解决方案 > 计算具有相同值的对象的频率数

问题描述

例如我有一个列表:

ArrayList<Observer> arrlist = new ArrayList<Observer>();

该列表包含观察者对象,但我想知道具有相同值的对象的频率,例如字符串名称

    public class  Observer{
    private String name;
}

我怎么做?

标签: javaoop

解决方案


您基本上需要遍历观察者并计算每个键的出现次数(根据您的需要,可能只是一个属性或组合)。

以您的关键为例,Observer.name您可以执行以下操作:

Map<String, List<Observer>> observersByName = 
       arrlist.stream().collect(Collectors.groupingBy(Observer::getName));

然后遍历条目集并调用size()值列表以获取频率。

如果你直接想获取频率,添加一个counting()收集器:

Map<String, Long> nameFrequency = arrlist.stream().collect(
                                     Collectors.groupingBy(Observer::getName,
                                                           Collectors.counting()));

如果您想在不使用流的情况下获得频率,可以使用以下Map.merge()方法:

Map<String, Integer> nameFrequency = new HashMap<>();
for( Observer obs : arrlist ) {
   //use the name as the key, associate a value of 1 with each key
   //if an entry already existed merge existing and new value by summing them
   frequency.merge( obs.getName(), 1, Integer::sum);
}

推荐阅读