当前位置: 首页 > 面试题库 >

计数Java集合中出现次数的优雅方法

陈增
2023-03-14
问题内容

给定具有可能重复项的对象的集合,我想最后对每个对象的出现次数进行计数。我通过初始化一个empty
Map,然后遍历Collection并将对象映射到其计数(每次映射已经包含该对象时增加计数)来实现。

 public Map<Object, Integer> countOccurrences(Collection<Object> list){
      Map<Object, Integer> occurrenceMap = new HashMap<Object, Integer>();

      for(Object obj: list){
           Integer numOccurrence = occurrenceMap.get(obj);
           if(numOccurrence == null){
                //first count
                occurrenceMap.put(obj, 1);
           } else{
                occurrenceMap.put(obj, numOccurrence++);
           }
      }
      return occurrenceMap;
 }

对于计算发生次数的简单逻辑而言,这看起来太冗长。有没有更优雅/更短的方法呢?我对完全不同的算法或特定于Java语言的功能持开放态度,该功能允许使用较短的代码。


问题答案:

查看Guava的Multiset。几乎正是您要寻找的东西。

不幸的是,它没有addAll(Iterable iterable)函数,但是在集合上调用add(E e)进行简单循环很容易。

编辑

我的错,它确实有一个addAll方法-因为必须实现,因为它实现了Collection。



 类似资料:
  • 我正在尝试检索列表中最频繁和不太频繁的元素。 我的输出是: 我试了一下: 但我不想使用模块并尝试更面向逻辑的解决方案。 你能帮我做没有收集吗?

  • 我已经将代码中的read整数修复为不再是I而是一个单独的变量“index”,并理解为什么我会收到Over Ofbound异常,但我有点厚,不明白如何在添加哨兵值0的同时修复它。

  • 我正在尝试获取每分钟出现数据的次数。日期看起来是这样的。第一个数字是一个整数,表示自Unix纪元以来的秒数,我将其转换为ISO 8601时间。第二个数字是双精度的。以“00”结尾的时间代表第0分钟,以“60”结尾的时间代表第1分钟。 代码: 我的输出是这样的: 但我正在寻找类似下面的东西(忽略新的分钟找到的文本) 我如何调整它,以便我跟踪当前分钟并添加到计数器,而不会过早地打印出计数器?

  • 问题内容: 我正在编写一个项目,该项目从.java文件中捕获Java关键字,并使用地图跟踪事件的发生。过去,我已经成功地使用了类似的方法,但是我似乎无法为我的预期用途采用这种方法。 该代码块应该将关键字添加到键,并在每次出现相同的键时递增该值。到目前为止,它添加了关键字,但是未能正确增加该值。这是一个示例输出: 基本上,它会增加映射中的每个值,而不是应该增加的值。我不确定我是否对此考虑过多。我尝试

  • 本文向大家介绍java计算给定字符串中出现次数最多的字母和该字母出现次数的方法,包括了java计算给定字符串中出现次数最多的字母和该字母出现次数的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java计算给定字符串中出现次数最多的字母和该字母出现次数的方法。分享给大家供大家参考,具体如下: PS:这里再为大家推荐几款在线字符统计工具供大家参考: 在线字数统计工具: http://to

  • 问题内容: 设和为两个集合。我正在寻找一种 非常 快速或优雅的方法来计算它们之间的设置差异(或,取决于您的偏好)。如标题所示,这两组存储和存储为Javascript数组。 笔记: 壁虎特技可以 我更喜欢本机函数(但是如果速度更快,我可以使用轻量级库) 我看过但未测试JS.Set(请参阅上一点) 编辑: 我注意到有关包含重复元素的集合的评论。当我说“设置”时,我指的是数学定义,这意味着(除其他外)它