0

可能重复:
如何计算列表中元素的出现次数
ArrayList 中单词的出现次数

假设我有一个列出以下值

emp1, emp2, emp3, emp2, emp1, emp4, emp1

我需要获取字符串重复的次数,如下所示

emp1 - 3 times  
emp2 - 2 times  
emp3 - 1 times  
emp4 - 1 times  

我正在尝试通过使用地图来实现这一点。这是正确的方法还是有更好的方法?

4

2 回答 2

2

您有多个选项,您可以使用一个Map<Item, Integer>并使用映射值来存储频率,这将有利于时间复杂度,但不利于空间复杂度。

for (Item i : list)
{
  Integer f = map.get(i);

  if (f == null)
    map.put(i, 1);
  else
    map.put(i, ++f);
}

否则,您可以使用一些设施方法,Collections.frequency(Collection<?> c, Object o)但只有在您正在寻找单个元素的频率时才会这样做,否则您将需要一个集合来检查唯一性,因此第一种方法会更好。

于 2012-07-25T03:15:54.097 回答
2

您可以使用Multisetfrom Guava,它将计算每个值的出现次数。最简单的实现是HashMultiset,但您也可以使用不可变的实现,例如ImmutableMultiset如果您需要保留它。

使用起来很简单:

Multiset<Item> items = HashMultiset.create(list);
System.out.println(items.count(someItem));
for (Multiset.Entry<Item> entry : items.entrySet()) {
    System.out.println(entry.getElement() + " - " + entry.getCount() + " times");
}
于 2012-07-25T08:31:05.917 回答