【发布时间】:2016-06-18 22:30:38
【问题描述】:
我有一个名为 values(Iterable values)的 Iterable 对象,我想将它们添加到不同元素的列表中。
for (Text val : values) {
if (!mylist.contains(val)) {
mylist.add(val);
}
}
它只会在这个列表中添加一个元素。如果我删除该条件以检查区别,我会看到所有元素都重复了。
我尝试了很多东西,我想也许我应该使用这样的 .get() 方法
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);
}
}
}
【问题讨论】:
-
为什么不使用
Set?另外,context.write(t1, t1);应该做什么? -
我也尝试过 set,但 Set 也会发生这种情况。我知道 set 只能包含不同的值,但在我的 hadoop 程序中,输出是相同的。