2009-06-29 48 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天提供的功能。)