【问题标题】:Getting compilation error "Can only iterate over an array or an instance of java.lang.Iterable" at for loop in reducer在reducer的for循环中出现编译错误“只能迭代数组或java.lang.Iterable的实例”
【发布时间】:2016-03-18 07:20:59
【问题描述】:

在reducer的for循环中出现编译错误“只能遍历数组或java.lang.Iterable的实例”。

public void reduce(Text key, Iterator<IntWritable> values,
            OutputCollector<Text, IntWritable> Output, Reporter arg3)
            throws IOException {
        // TODO Auto-generated method stub

        int sum = 0;
         for (IntWritable val : values) {
           sum += val.get();

在上面的代码中,在"for (IntWritable val : values)" 处出现编译错误“只能遍历数组或 java.lang.Iterable 的实例”。如何在同一个中使用循环?

【问题讨论】:

    标签: java arrays hadoop mapreduce iterator


    【解决方案1】:

    要么将 Iterable&lt;IntWritable&gt; 而不是 Iterator&lt;IntWritable&gt; 传递给方法,要么使用 hasNext()next() 迭代 Iterator 的元素:

     while (values.hasNext()) {
        IntWritable val = values.next();
        ...
    }
    

    【讨论】:

      【解决方案2】:

      试试这个。

          for (IntWritable val : (Iterable<IntWritable>)() -> values) {
              sum += val.get();
              ....
      

      (Iterable&lt;IntWritable&gt;)() -&gt; values 等价于

          new Iterable<IntWritable>() {
      
              @Override
              public Iterator<IntWritable> iterator() {
                  return values;
              }
      
          };
      

      【讨论】:

        【解决方案3】:

        迭代器通常指向集合中的单个实例。 所以for (IntWritable val : values) 无效。

        请改用Iterable。在你的函数中传递Iterable&lt;IntWritable&gt;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-04
          • 2014-04-20
          • 2014-05-23
          • 2016-07-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多