【问题标题】:Java iterate over Iterable<Text> values and add them to a list of distinct valuesJava 迭代 Iterable<Text> 值并将它们添加到不同值的列表中
【发布时间】: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 程序中,输出是相同的。

标签: java list getter iterable


【解决方案1】:

我们需要使用[Set][1] 来获取不同的值,因为[set][1] 不会添加已经存在的值(因此,无需检查contains())。现在,为了让 set 确定唯一值,我们需要在我们的类中重写 equals()hashCode() 方法(在我们的例子中是 Text)。

This 示例说明需要做什么。

【讨论】:

  • 根据您的建议,我猜这个类 Text(在 Hadoop 中定义)可能不是从 Comparable 类继承的。我会将文本值转换为字符串并尝试看看会发生什么。
  • 在这种情况下,如果我们知道 Text 类的内容,那么我们可以定义自己的 comparator 并使用 TreeSet 来存储值,如下所述:stackoverflow.com/questions/14880450/…
【解决方案2】:

最好的办法是使用一组。

实例化一个 HashSet,它使用对象的 equals 方法仅在 distint 时添加值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2022-02-08
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多