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

时间:2009-06-29 16:03:57

标签: java data-structures collections

我有一个重复输入值的流输入。我可以使用任何数据结构,但我必须计算每个元素的出现次数。假设我有以下手机供应商列表:

Apple
Nokia
Samsung
Apple
LG
Nokia
HTC
Android
Apple
Nokia
Nokia
Apple
Samsung

我必须构建任何数据结构,最好是带有

等详细信息的地图
Apple,4
Nokia,4
Samsung,2
LG,1
Android,1

我不确定这是否是最佳的。有没有比这更好的解决方案?
实际上我还没有把上面的内容写成代码。所以更好的代码也会有所帮助。

6 个答案:

答案 0 :(得分:5)

是的,我会使用Map<String, Integer>。我会将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);
}

或者没有泛型:

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

答案 1 :(得分:4)

由于提问者提到无法使用泛型,因为目标平台是Java 1.4,可以使用不使用泛型的Apache Commons Collections

answer by pjp提到可以使用行李。

事实证明,Apache Commons Collections有一个Bag,它有一个getCount方法,它将返回添加到Bag的某个对象的计数。

以下是addHashBagInteger个对象的示例,并计算Integer包含的每个Bag对象的数量:

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

(我应该添加一个免责声明,这个代码实际上是在Java 6上编译和运行的,但我相信我只使用了Java前5天的功能。)

答案 2 :(得分:1)

数据来自哪里?如果是db - 您可以在后端使用group by查询中轻松完成此操作。

答案 3 :(得分:0)

地图似乎要走了。直接访问:)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

最自然的结构是Bag aka a Multiset。

一个包本质上是一个从Object到Count的函数。

Google系列有一个Multiset,但您可以使用HashMap轻松构建自己的。

http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multiset.html