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

Java 哪种方法更适合在arraylist中查找元素的频率?,java,arraylist,Java,Arraylist,我创建了一个数组列表并随机插入了几个元素。我试图找到每个元素出现的频率。我尝试了两种方法,两种方法都很好。第一种方法是使用JAVA中可用的直接方法,即 Collection.frequency(collection,"element"); 第二种方法是将ArrayList元素放入HashMap并查找频率 List<String> elements = new ArrayList<String>(); elements.add("A"); el

我创建了一个数组列表并随机插入了几个元素。我试图找到每个元素出现的频率。我尝试了两种方法,两种方法都很好。第一种方法是使用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);
        }
    }
List elements=new ArrayList();
元素。添加(“A”);
元素。添加(“B”);
元素。添加(“C”);
元素。添加(“A”);
映射计数=新的HashMap();
用于(字符串s:元素)
{
如果(集装箱数量)
{
计数。放(s,计数。获取(s)+1;
}
其他的
{
数一数二(s,1);
}
}

这两种方法都很好。但我想知道哪种方法更好。

好吧,如果您要多次要求列表中元素的频率,使用映射会更有效,因为
集合。频率每次调用时都会迭代整个列表,而在地图中搜索一个键需要固定的时间


如果您只需要知道少数元素的频率,而且非常少,而且您的列表不太大,那么使用现有的方法不会太糟糕,而且肯定比维护频率图容易。

如果您要多次要求列表中元素的频率,使用映射会更有效,因为每次调用时,
Collections.frequency
都会迭代整个列表,而在映射中搜索一个键需要固定的时间


如果您只需要知道少数元素的频率,而且非常少,并且您的列表不太大,那么使用现有的方法也不会太糟糕,这肯定比维护频率图更容易。

这取决于您需要多长时间获取频率信息-如果是一次性的,那么
Collections::frequency
方法很好,否则地图将更有效。还请注意,使用Java 8,您可以使用以下工具保存几行代码:

Map<String, Long> count = elements.stream().collect(groupingBy(e -> e, counting()));
Map count=elements.stream().collect(groupingBy(e->e,counting());
假设以下导入:
导入静态java.util.stream.Collectors.counting

导入静态java.util.stream.Collectors.groupingBy

这取决于您需要获取频率信息的频率-如果是一次性的,则可以使用
Collections::frequency
方法,否则映射将更有效。还请注意,使用Java 8,您可以使用以下工具保存几行代码:

Map<String, Long> count = elements.stream().collect(groupingBy(e -> e, counting()));
Map count=elements.stream().collect(groupingBy(e->e,counting());
假设以下导入:
导入静态java.util.stream.Collectors.counting

导入静态java.util.stream.Collectors.groupingBy

你的问题有点含糊,更好的方法是基于什么


正如Eran指出的,如果您关心性能,并且会多次调用此函数,那么HashMap将为您节省时间。但是如果不是,那么仅仅使用频率应该更清晰,并且会减少代码的混乱,所以我认为一般来说使用前者会更好。一般来说,你希望使用已经存在的方法,而不是自己复制它们。

你的问题有点模糊,一个更好的方法是基于什么


正如Eran指出的,如果您关心性能,并且会多次调用此函数,那么HashMap将为您节省时间。但是如果不是,那么仅仅使用频率应该更清晰,并且会减少代码的混乱,所以我认为一般来说使用前者会更好。一般来说,您希望使用已经存在的方法,而不是自己复制它们。

如果您需要多个或所有元素的频率,您的映射方法很好,因为您只需迭代列表一次。然而,映射只是您调用它时列表频率的快照,如果列表更改,更新它将比重新计算更复杂

最后,如果您使用的是小列表,那么您不应该关心性能问题。我认为这只会影响列表中的数千个元素,或者每秒调用多次此函数(某些实时服务)

在任何其他情况下,您几乎不必考虑哪种方法更好,因为这并不重要


另一方面,你的问题表明你需要每个元素的频率。。。因此,在列表中,首先需要创建一个集合,以便获得唯一的元素,然后应用Collections.frequency()方法。。。考虑到这一点,我真的会使用Map方法,或者在Java8中使用更酷的流方法…

如果您需要多个或所有元素的频率,那么Map方法很好,因为您只需迭代列表一次。然而,映射只是您调用它时列表频率的快照,如果列表更改,更新它将比重新计算更复杂

最后,如果您使用的是小列表,那么您不应该关心性能问题。我认为这只会影响列表中的数千个元素,或者每秒调用多次此函数(某些实时服务)

在任何其他情况下,您几乎不必考虑哪种方法更好,因为这并不重要


另一方面,你的问题表明你需要每个元素的频率。。。因此,在列表中,首先需要创建一个集合,以便获得唯一的元素,然后应用Collections.frequency()方法。。。考虑到这一点,我真的会使用Map方法,或者在Java8中使用更酷的流方法……

这是一个很酷的建议。。。然而,它也是我的