假设我有一个列出以下值
emp1, emp2, emp3, emp2, emp1, emp4, emp1
我需要获取字符串重复的次数,如下所示
emp1 - 3 times
emp2 - 2 times
emp3 - 1 times
emp4 - 1 times
我正在尝试通过使用地图来实现这一点。这是正确的方法还是有更好的方法?
假设我有一个列出以下值
emp1, emp2, emp3, emp2, emp1, emp4, emp1
我需要获取字符串重复的次数,如下所示
emp1 - 3 times
emp2 - 2 times
emp3 - 1 times
emp4 - 1 times
我正在尝试通过使用地图来实现这一点。这是正确的方法还是有更好的方法?
您有多个选项,您可以使用一个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)
但只有在您正在寻找单个元素的频率时才会这样做,否则您将需要一个集合来检查唯一性,因此第一种方法会更好。
您可以使用Multiset
from 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");
}