例如,我有一个列表:
ArrayList<Observer> arrlist = new ArrayList<Observer>();
该列表包含观察者对象但我想知道具有相同值的对象的频率,例如String-name
public class Observer{
private String name;
}
我该怎么做?
您基本上需要对观察者进行迭代,并计算每个键的出现次数(根据需要,可以是单个属性或组合(。
以密钥为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);
}