我创建了一个数组列表并随机插入了一些元素。我试图找到每个元素出现的频率。我尝试了两种方法并且都工作正常。第一种方法是使用一种直接的方法JAVA即,
Collection.frequency(collection,"element");
第二种方法是将ArrayList元素放入HashMap并找到频率
List<String> elements = new ArrayList<String>();
elements.add("A");
elements.add("B");
elements.add("C");
elements.add("A");
Map<String,Integer> count = new HashMap<String,Integer>();
for(String s : elements)
{
if(count.containsKey(s))
{
count.put(s,count.get(s)+1);
}
else
{
count.put(s, 1);
}
}
这两种方法都运行良好。但我想知道哪种方法更好。
答案 0 :(得分:8)
这取决于您需要获取频率信息的频率 - 如果它是Collections::frequency
方法的一个,那么地图将更有效。另请注意,使用Java 8,您可以使用以下代码保存几行代码:
Map<String, Long> count = elements.stream().collect(groupingBy(e -> e, counting()));
假定以下导入:
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
答案 1 :(得分:3)
好吧,如果你要多次要求List中元素的频率,那么使用Map会更有效率,因为Collections.frequency
每次调用它时都会遍历整个列表,同时搜索一个键在地图中需要不变的时间。
如果你只需要知道几个元素的频率,并且很少,并且你的列表不是太大,使用现有的方法也不会太糟糕,而且它肯定比维护一个频率图更容易。 / p>
答案 2 :(得分:0)
那你的问题有点模糊,基于什么更好的方法?
正如Eran所指出的那样,如果你关注性能并且你将多次拨打这个电话,那么HashMap将节省你的时间。但如果没有,那么只使用频率应该更加清晰,并且会减少你的代码混乱,所以我认为一般使用前者是首选。通常,您希望使用已经存在的方法而不是自己复制它们。
答案 3 :(得分:0)
如果您只需要迭代列表一次,那么您需要多个或所有元素的频率,那么您的Map方法就可以了。但是,Map只是您调用它时列表频率的快照,更新它比重新计算更复杂,如果列表更改...
最后,如果您使用的是小型列表,则不应该关注性能问题。我认为这只会影响列表中是否有数千个元素,或者每秒多次调用此函数(某些实时服务)。
在任何其他情况下,你几乎不必考虑哪种方法更好,因为它真的很重要。
另一方面,您的问题表明您需要每个元素的频率...因此,在List中,您首先需要创建一个Set,以便获得唯一元素,然后应用Collections.frequency( )方法......考虑到这一点,我真的会使用Map方法,或者在Java8中使用更酷的流方法......