当前位置: 首页 > 面试题库 >

对值进行两次迭代(MapReduce)

孟谭三
2023-03-14
问题内容

我收到一个迭代器作为参数,并且想对值进行两次迭代。

public void reduce(Pair<String,String> key, Iterator<IntWritable> values,
                   Context context)

可能吗 ?怎么样 ?签名是由我使用的框架(即Hadoop)强加的。

-编辑-
最后,该reduce方法的真正签名是一个iterable。我被这个Wiki页面所迷住了(实际上这是我发现的唯一不被弃用(但错误的)单词计数示例)。


问题答案:

如果要再次迭代,我们必须缓存来自迭代器的值。至少我们可以将第一次迭代和缓存结合起来:

Iterator<IntWritable> it = getIterator();
List<IntWritable> cache = new ArrayList<IntWritable>();

// first loop and caching
while (it.hasNext()) {
   IntWritable value = it.next();
   doSomethingWithValue();
   cache.add(value);
}

// second loop
for(IntWritable value:cache) {
   doSomethingElseThatCantBeDoneInFirstLoop(value);
}

(只需要添加代码答案,就知道您在自己的注释中提到了该解决方案;))

为什么 不进行缓存就不可能做到:
为什么Iterator是实现接口的Iterator对象,并且没有一个唯一的要求,即对象实际上存储值。进行两次迭代,您必须重置迭代器(不可能)或克隆它(再次:不可能)。

举一个克隆/重置毫无意义的迭代器为例:

public class Randoms implements Iterator<Double> {

  private int counter = 10;

  @Override 
  public boolean hasNext() { 
     return counter > 0; 
  }

  @Override 
  public boolean next() { 
     count--;
     return Math.random();        
  }

  @Override 
  public boolean remove() { 
     throw new UnsupportedOperationException("delete not supported"); 
  }
}


 类似资料:
  • 问题内容: 为什么我不能对相同的数据进行两次迭代? 这将打印“执行一次”几次(由于数据有几行),但是根本不会打印“执行两次”。 我第一次遍历数据工作正常,但是第二次当我运行最后一个列表“针对数据行”时,此操作什么都不返回……因此一次执行它却不能两次……? 仅供参考-数据是一个csv.reader对象(如果是原因)… 问题答案: 这是因为它data是一个迭代器,你只能使用一次迭代器。例如: 如果我们

  • 问题内容: 我有一个像(669256.02,6117662.09,669258.61,6117664.39,669258.05,6117665.08)的集合需要迭代 将打印 我在Python 3.3 btw上 问题答案: 您可以使用迭代器:

  • 标题有点混乱,很抱歉,所以我有一个太多的数组,其中一个数组比第二个数组包含更多 所以我想做的是例如 这只会注销第一个一次,但我想要的是日志y和x长度一样多,希望这是足够清楚的

  • 问题内容: 我有一个这样的对象: 我需要在HTML表中获取ID和名称,但是似乎很难遍历此对象。TIA。我知道我需要先到达“值数组”,然后再到达“组”对象,但是我要遍历对象和数组之间的过渡以及foreach与基于索引的迭代。 例如,我尝试了这个: 它遍历对象,但也给我没用 问题答案:

  • 问题内容: 我正在尝试查找给定字符串的排列,但是我想使用迭代。我在网上找到了递归解决方案,但我确实理解它,但是将其转换为迭代解决方案实际上是行不通的。下面附上我的代码。我非常感谢您的帮助: 问题答案: 在我的相关问题评论之后,这是一个Java实现,可以使用Counting QuickPerm Algorithm 来完成您想要的事情: