如何从列表中获取重复值(计数)的数量

时间:2012-07-25 03:10:24

标签: java list collections map

  

可能重复:
  How to count occurrence of an element in a List
  Count occurences of word in ArrayList

假设我有一个List列出以下值

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

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

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

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

2 个答案:

答案 0 :(得分: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)这样的设施方法,但只有当你在寻找单个元素的频率时才会这样做,否则你需要一个集来检查唯一元素,所以第一种方法会更好。

答案 1 :(得分:2)

您可以使用Multiset中的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");
}