2009-06-29 100 views
5

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

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

我有最好建立任何数据结构与细节的地图就像

 
Apple,4 
Nokia,4 
Samsung,2 
LG,1 
Android,1 

我不知道这是否是最佳的。有没有比这更好的解决方案?
其实我还没有把上面的代码写出来。所以更好的代码也会有所帮助。

+0

“计数列表中的项目”,似乎误导 – Tom 2009-06-29 16:05:59

回答

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); 
} 
+0

一个小的信息......我不能使用泛型,因为我不得不使用Java 1.4 – Harish 2009-06-29 16:15:24

+0

冷却它的工作原理,并感谢为 – Harish 2009-06-29 16:42:36

1

在哪里从数据正在添加?如果一个数据库 - 你可以很容易地做到这一点,在与群组的后端查询。

+0

都能跟得上它从平面文件 – Harish 2009-06-29 16:17:42

0

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

密钥:元素 值:出现次数或列表中包含元素索引的列表。

0

除了已经发布。这使我想到的第一件事解决方案是使表“码 - 价值”,用代码编码列表。这将非常节省空间。

4

因为它是由不能被使用仿制药的提问中提到,作为目标平台是Java 1.4中,可以使用的Apache Commons Collections不使用泛型。

answer by pjp提到可以使用Bag。

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

下面是一个例子add小号一些Integer对象到HashBag,以及计数有多少每个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天提供的功能。)