我有一个重复输入值的流输入。我可以使用任何数据结构,但我必须计算每个元素的出现次数。假设我有以下手机供应商列表:
Apple Nokia Samsung Apple LG Nokia HTC Android Apple Nokia Nokia Apple Samsung
我必须构建任何数据结构,最好是带有
等详细信息的地图Apple,4 Nokia,4 Samsung,2 LG,1 Android,1
我不确定这是否是最佳的。有没有比这更好的解决方案?
实际上我还没有把上面的内容写成代码。所以更好的代码也会有所帮助。
答案 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
的某个对象的计数。
以下是add
对HashBag
的Integer
个对象的示例,并计算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轻松构建自己的。