【问题标题】:Counting the number of occurrences of each item in a list计算列表中每个项目的出现次数
【发布时间】:2009-06-29 16:03:57
【问题描述】:

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

苹果 诺基亚 三星 苹果 LG 诺基亚 宏达电 安卓 苹果 诺基亚 诺基亚 苹果 三星

我必须构建任何数据结构,最好是带有详细信息的地图

苹果,4 诺基亚,4 三星,2 LG,1 安卓,1

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

【问题讨论】:

  • “计算列表项”似乎具有误导性

标签: java data-structures collections


【解决方案1】:

是的,我会使用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);
}

【讨论】:

  • 一个小信息...我不能使用泛型,因为我必须使用 Java 1.4
【解决方案2】:

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

answer by pjp 提到可以使用 Bag。

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

以下是adds 一些Integer 对象到HashBag 的示例,并计算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)));

结果是:

计数为 1:1 数为 2:2 数为 3:1

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

【讨论】:

  • 太棒了...我想投票给你,但我还没有获得声誉...感谢您的回复
  • +1,这应该是公认的答案。不这样做的唯一可能原因是害怕外部库(我自己也有)。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    地图似乎是要走的路。直接访问:)

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        最自然的结构是 Bag aka Multiset。

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

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

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

        【讨论】:

        • 这很好,但如何计算?
        • 请注意,Google Collections 需要 Java 5。除此之外,这比我的回答更容易做到。
        • 您可以通过对 entrySet() 进行交互来获取计数。如果您想流式传输计数,您可以扩展实现以在计数更改时通知侦听器。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多