2

给定某事物的排序列表 (a,a,b,c,c)

a识别列表中存在 2 次、b一次和2 次的最有效方法是c什么?

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

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

最终目标是迭代列表并知道在任何给定点之前看到过多少次键。将事物放入地图中,似乎是我们并不真正需要的一步。

4

2 回答 2

3

我会在GuavaMultiset中使用一个实现——可能是. 这避免了必须在每次迭代中执行/ - 如果添加时该项目已经存在,它只会增加计数。这有点像使用.HashMultisetputgetHashMap<Foo, AtomicInteger>

有关更多详细信息,请参阅Guava 用户指南条目。Multiset

于 2012-09-19T21:04:38.450 回答
1

你的方法,在每次迭代中,都会使

  • 一次查找 containsKey
  • 一次查找获取
  • 一个从整数到整数的拆箱
  • 从 int 到 Integer 的一拳击
  • 一放

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

但即使你保留你的算法,使用 get 并将结果与​​ null 进行比较至少可以避免不必要的查找。

于 2012-09-19T21:05:31.687 回答