Java 计算列表中每个项目的出现次数

Java 计算列表中每个项目的出现次数,java,data-structures,collections,Java,Data Structures,Collections,我有一个具有重复值的流式输入。我可以使用任何数据结构,但我必须计算每个元素的出现次数。假设我有一个移动电话供应商列表,如下所示: Apple Nokia Samsung Apple LG Nokia HTC Android Apple Nokia Nokia Apple Samsung 苹果 诺基亚 三星 苹果 LG 诺基亚 宏达电 安卓 苹果 诺基亚 诺基亚 苹果 三星 我必须建立任何数据结构,最好是一个详细的地图,如 Apple,4 Nokia,4 Samsung,2 LG,1 Androi

我有一个具有重复值的流式输入。我可以使用任何数据结构,但我必须计算每个元素的出现次数。假设我有一个移动电话供应商列表,如下所示:

Apple Nokia Samsung Apple LG Nokia HTC Android Apple Nokia Nokia Apple Samsung 苹果 诺基亚 三星 苹果 LG 诺基亚 宏达电 安卓 苹果 诺基亚 诺基亚 苹果 三星 我必须建立任何数据结构,最好是一个详细的地图,如

Apple,4 Nokia,4 Samsung,2 LG,1 Android,1 苹果,4 诺基亚,4 三星,2 LG,1 安卓,1 我不确定这是否是最佳的。有比这更好的解决方案吗?

事实上,我还没有将上述内容作为代码编写。因此,更好的代码也会有所帮助。

数据从何处提交?如果一个db-你可以很容易地通过group by在后端的查询中做到这一点。

是的,我会使用
映射。我会将
add
包装成如下内容:

private static void incrementValue(Map<String, Integer> counters, String toAdd) {
    Integer currValue = counters.get(toAdd);
    if (currValue == null)
        counters.put(toAdd, 1);
    else
        counters.put(toAdd, currValue+1);
}

地图似乎是最好的选择。直接访问:)

关键词:元素
值:出现的次数,或列表中包含元素索引的列表。

除了已发布的解决方案之外,我想到的第一件事是制作一个表“code-value”,并使用代码对列表进行编码。这将是非常节省空间的。

最自然的结构是一个袋子,也就是一个多组的袋子

袋子本质上是一个从物体到计数的函数

Google collections有一个Multiset,但是你可以使用HashMap轻松地构建自己的集合


因为提问者提到不能使用泛型,因为目标平台是Java 1.4,所以可以使用不使用泛型的

书中提到可以使用袋子

事实证明,apachecommons集合有一个方法,该方法将返回添加到
包中的某个对象的计数

下面是一个示例,它将一些
Integer
对象添加到a,并计算
Bag
包含的每个
Integer
对象的数量:

Bag b = new HashBag();

b.add(Integer.valueOf(1));
b.add(Integer.valueOf(2));
b.add(Integer.valueOf(2));
b.add(Integer.valueOf(3));

System.out.println("Count for 1: " + b.getCount(Integer.valueOf(1)));
System.out.println("Count for 2: " + b.getCount(Integer.valueOf(2)));
System.out.println("Count for 3: " + b.getCount(Integer.valueOf(3)));
结果是:

Count for 1: 1 Count for 2: 2 Count for 3: 1 计数为1:1 数到2:2 数到3:1
(我应该补充一条免责声明,这段代码实际上是在Java 6上编译和运行的,但我相信我只使用了Java之前5天的功能。)

“计算列表项”似乎误导了一个小信息…我不能使用泛型,因为我必须使用Java 1.4。这很好,但是如何计算呢?请注意,Google Collections需要Java 5。除此之外,这比我的答案还要容易。您可以通过在entrySet()上进行交互来获得计数。如果你想对计数进行流式处理,你可以扩展实现,在计数发生变化时通知侦听器。这太棒了……我想投你的票,但我还没有获得声誉……感谢回复+1,这应该是公认的答案。不这样做的唯一可能的原因是害怕外部库(我自己也有)。 Count for 1: 1 Count for 2: 2 Count for 3: 1