哪种方法更适合查找arraylist中元素的频率?

时间:2015-01-08 11:35:40

标签: java arraylist

我创建了一个数组列表并随机插入了一些元素。我试图找到每个元素出现的频率。我尝试了两种方法并且都工作正常。第一种方法是使用一种直接的方法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);
        }
    }

这两种方法都运行良好。但我想知道哪种方法更好。

4 个答案:

答案 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中使用更酷的流方法......