2012-09-19 57 views
2

鉴于东西排序列表(A,A,B,C,C)如何获取列表中每个元素的计数?

什么会认识到a在列表中存在2次,一次bc 2倍的最有效方法是什么?

除了明显的制作计数地图。我们能做得更好吗?

  if (map.containsKey(key)) { 
       map.put(key, map.get(key) + 1); 
      } else { 
       map.put(key, 1); 
      } 

最终目标是迭代列表,并知道在任何给定的点上以前看过某个键的次数。把东西放在地图上,看起来像是我们并不需要的一步。

回答

1

你的方法,在每次迭代,使得

  • 一个查找了的containsKey
  • 一个查找从整数得到
  • 一个拆箱到从int到整数
  • 诠释
  • 一个拳击一放

你可以简单地比较将当前元素添加到前一个元素,如果相等,则增加一个计数,如果不是,则进行计数(并将计数器重置为1)。

但即使你保持你的算法,使用get和比较结果为null将至少避免不必要的查找。

+0

我按照你的建议手动编写了所有步骤。获得最佳性能数字 – JAM

3

我会在Guava中使用Multiset实现 - 可能是HashMultiset。这样可避免在每次迭代时都必须执行put/get - 如果在添加项目时该项目已存在,则只会增加计数。这有点像使用HashMap<Foo, AtomicInteger>

查看Guava User's Guide entry on Multiset了解更多详情。

+0

你能提供一个例子吗? – JAM

+0

@Jam:您是否阅读过文档?这非常简单...一定要去,如果你遇到困难,请寻求帮助。 –

+0

完美。谢谢:) – JAM

相关问题