2012-11-20 47 views
0

映射器僅輸出一次該值。但是當我檢查組合器有兩次的值。這對我來說真的很奇怪。組合器中的映射器輸出加倍

請幫忙。

從那裏輸出被髮送的地圖代碼模塊:

for(int i = 0; i<alcmapi.size(); i++) 
{ 
    int section = 0; 

    for(int j = 0; j<alcmapj.size(); j++) 
    { 
     if(!alcmapi.get(i).getid().equals(alcmapj.get(j).getid())) 
     { 
      int fi = Integer.parseInt(alcmapi.get(i).getField()); 
      int fj = Integer.parseInt(alcmapj.get(j).getField()); 

      ArrayList<CustomMap> al = new ArrayList<CustomMap>(); 
      al.add(new CustomMap(alcmapi.get(i).getid(), fi)); 
      al.add(new CustomMap(alcmapj.get(j).getid(), fj)); 


      if(fi<fj) 
      { 
       section = fi; 
      } 
      else 
      { 
       section = fj; 
      } 
      Collections.sort(al); 
      { 
       output.collect(new Text(t+" "+al.get(0).getid()), new Text(al.get(1).getid()+" "+section));   

      } 
     } 
    } 
} 

在組合器:

我看到對應於密鑰的值出現一倍當我檢查這裏:

while(values.hasNext()){ 
    String val = values.next().toString(); 
    System.out.println("val:"+val); 
} 

提前致謝!

+0

表達'T +」「+ al.get(0).getid()'不依賴於循環索引'j'所以它會每次循環都要輸出。 – rsp

+0

我依賴於我的內部循環:檢查行:ArrayList al = new ArrayList (); al.add(新的CustomMap(alcmapi.get(i).getid(),fi)); al.add(new CustomMap(alcmapj.get(j).getid(),fj)); –

+0

請幫助解決此問題 –

回答

1

看起來像你測試所有其他元素的所有元素。例如,如果元素3和5符合條件,那麼你會在i = 3,j = 5和再次爲i = 5,j = 3時寫出一對。

我建議你改變你的內環到:

for(int j = i+1; j<alcmapj.size(); j++) 
+0

感謝您的回覆。情況就是這樣...... –