2016-03-05 56 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时才添加值。

相关问题