2014-07-16 56 views
-1

Hashmap不能計算所有的發生次數。Hashmap不能計算所有的發生次數

這是來自Hadoop Reduce()的示例代碼。

我映射了鍵和值

key---------6.9 
v---------------Iris-versicolor 
v---------------Iris-virginica 
v---------------Iris-virginica 
v---------------Iris-versicolor 
v---------------Iris-virginica 
v---------------Iris-virginica 
v---------------Iris-virginica 
v---------------Iris-virginica 
v---------------Iris-virginica 
v---------------Iris-virginica 
v---------------Iris-versicolor 
v---------------Iris-virginica 
v---------------Iris-versicolor 
v---------------Iris-versicolor 
v---------------Iris-virginica 

我預期的結果是

getVal-----------{Iris-versicolor=5, Iris-virginica=10} 

但我得到的輸出作爲

getVal-----------{Iris-versicolor=1, Iris-virginica=2} 

SOFAR我所做的是

System.out.println("key---------"+key); 
for(Text val:values){ 
    String v = val.toString(); 
    System.out.println("v---------------"+v); 
    if (getVal.isEmpty()) { 
     getVal.put(v, 1); 
    } 
    else { 
     for (String colId : getVal.keySet()) { 
     if(colId.equals(v)){ 
      Integer val1 = getVal.get(colId); 
      val1 = val1 + 1; 
      getVal.put(colId, val1); 
     } 
     else{ 
      getVal.put(v, 1); 
     } 

    } 

    } 
} 
System.out.println("getVal-----------"+getVal); 

我做錯了什麼?

+2

沒有沒有空格 –

+0

Downvoters請評論,這樣我可以改進的問題 –

回答

1
  1. 刪除else子句
  2. 值添加到地圖上,如果它不存在 - 不是在地圖上是空的!

例子:

System.out.println("key---------" + key); 

for (String value : values) { 

    // I used `String` instead of your `Text` type 
    // so I do not need this line 
    // String v = value.toString(); 

    System.out.println("v---------------" + value); 

    // if the value is not present, add it! 
    // each value will be added once! 
    if (!valueCounterMap.containsKey(value)) 
    valueCounterMap.put(value, 1); 

    // if the value is already present, just 
    // increment its counter by 1 
    else { 

     Integer counter = valueCounterMap.get(value); 
     valueCounterMap.put(value, ++counter); 
    } 
} 

System.out.println("getVal-----------" + valueCounterMap); 

結果:

getVal-----------{Iris-versicolor=5, Iris-virginica=10}