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