2016-03-05 25 views
1

我有一個名爲values(Iterable值)的Iterable對象,我想將它們添加到不同元素的列表中。Java遍歷可重用的<Text>值並將它們添加到不同值列表中

for (Text val : values) { 
    if (!mylist.contains(val)) { 
       mylist.add(val); 
    } 
} 

它onlu增加了一個元素到這個列表。如果我刪除這個條件來檢查獨特性,我會看到所有元素都被重複。

我已經嘗試了很多東西,我想,也許我應該使用獲得()方法,這樣

for (Text val : values) { 
    if (!mylist.contains(val.get())) { 
       mylist.add(val.get()); 
    } 
} 

但隨後的Java給出了這樣的錯誤,該符號VAL未發現:

>editorPairs.java:67: cannot find symbol 
>symbol : method get() 
>location: class org.apache.hadoop.io.Text 
>     mylist.add(val.get()); 
>        ^
>1 error 

完整的代碼如下:

public void reduce(Text key, Iterable<Text> values, Context context) 
       throws IOException, InterruptedException { 

     List<Text> mylist = new ArrayList<Text>(); 

     for (Text val : values) { 
      if (!mylist.contains(val)) { 
       mylist.add(val); 
      } 
     } 

     if(mylist.size() > 1) { 
      int size = mylist.size(); 
      for (int i=0; i<size; ++i) { 
       Text t1 = mylist.get(i); 
       context.write(t1, t1); 
      } 
     } 
} 
+0

爲什麼不使用'Set'?另外,'context.write(t1,t1);'應該做什麼? –

+0

我也嘗試設置,但它也發生在設置以及。我知道該集只能包含不同的值,但在我的hadoop程序中,輸出結果是相同的。 –

回答

1

我們需要使用[Set][1]來獲得不同的值[set][1]如果它已經存在,則不會添加該值(因此,不需要檢查)。現在,爲了允許設置確定唯一值,我們需要覆蓋我們課程中的equals()hashCode()方法(在本例中爲Text)。

This示例說明了需要完成的工作。

+0

根據你的建議,我想也許這個類Text(在Hadoop中定義)不是從Comparable類繼承的。我會將文本值轉換爲字符串,並嘗試看看會發生什麼。 –

+0

在這種情況下,如果我們知道Text類的內容,那麼我們可以定義自己的'comparator'並使用'TreeSet'來存儲這些值,如下所示:http://stackoverflow.com/questions/14880450/java-hashset -with-一個定製平等的準則。 –

0

要做的更好的事情是使用一套。

實例化一個HashSet,該HashSet使用對象的equals方法僅在distint時才添加值。

相關問題