2016-03-18 38 views
1

獲取編譯錯誤「只能遍歷數組或java.lang.Iterable的實例」at for在減速器中循環。獲取編譯錯誤「只能遍歷數組或java.lang.Iterable的實例」for reduce循環for

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的實例」。如何使用相同的循環?

回答

1

要麼通過一個Iterable<IntWritable>代替Iterator<IntWritable>該方法,或使用hasNext()next()遍歷Iterator的元素:

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

迭代通常指向一個集合中的單個實例。 因此for (IntWritable val : values)無效。

改爲使用Iterable。通過Iterable<IntWritable>在您的功能。

2

試試這個。

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

(Iterable<IntWritable>)() -> values相當於

new Iterable<IntWritable>() { 

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

    };