Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用迭代器复制集合_Java_Collections_Iterator_Copying - Fatal编程技术网

Java:使用迭代器复制集合

Java:使用迭代器复制集合,java,collections,iterator,copying,Java,Collections,Iterator,Copying,我有一个方法,作为参数,它有一个到集合的迭代器。在我想要复制迭代器“指向”的集合的方法内部。 但是,只有最后一个集合项存在于集合副本中,它存在N次,其中N是原始集合的大小 public void someMethod(Iterator<Node> values) { Vector<Node> centralNodeNeighbourhood = new Vector<Node>(); while (values.hasNext()) { Nod

我有一个方法,作为参数,它有一个到集合的迭代器。在我想要复制迭代器“指向”的集合的方法内部。 但是,只有最后一个集合项存在于集合副本中,它存在N次,其中N是原始集合的大小

public void someMethod(Iterator<Node> values) {
  Vector<Node> centralNodeNeighbourhood = new Vector<Node>();
  while (values.hasNext()) {
    Node tmp = values.next();
    centralNodeNeighbourhood.add(tmp);
  }
  ...
  //store the centralNodeNeighbourhood on disk
}
示例“CentralNode邻里集合”:

有人能指出我的错误吗?我无法更改方法args,我只获取集合的迭代器,对此无能为力

更新(回答一些问题)

打印正确的原始集合元素。 我不知道原始集合是什么类型,但迭代器来自std java。方法是

public class GatherNodeNeighboursInfoReducer extends MapReduceBase
        implements Reducer<IntWritable, Node, NullWritable, NodeNeighbourhood>{
    public void reduce(IntWritable key, Iterator<Node> values,
                   OutputCollector<NullWritable, NodeNeighbourhood> output, Reporter reporter) throws IOException {...}
}
公共类GatherNodeIghBoursInForeDucer扩展了MapReduceBase
机具减速器{
public void reduce(可写键、迭代器值、,
OutputCollector输出,报告器报告器)引发IOException{…}
}
来自旧Hadoop api(Hadoop版本0.20.203.0)的方法

解决
我在每次迭代中创建了一个tmp对象的副本,并将该副本添加到CentralNodeNeighborhood集合中。这解决了我的问题。谢谢您的所有(快速)帮助。

看来迭代器每次都返回相同的节点对象。如果是这样,则需要在将节点添加到集合之前获取该节点的副本。(否则,您将每次添加相同的对象,并且它将具有上次设置的值)

迭代器似乎每次都返回相同的节点对象。如果是这样,则需要在将节点添加到集合之前获取该节点的副本。(否则,每次添加的对象都是相同的,并且它将具有上次设置的值)

Hadoop的方法指定它在迭代器中重用值对象。这是一件可怕的事情,但它就是这样做的

框架将重用传递到reduce中的key和value对象,因此应用程序应该克隆它们想要保留副本的对象。在许多情况下,所有值都合并为零或一个值

Hadoop的方法指定重用迭代器中的值对象。这是一件可怕的事情,但它就是这样做的

框架将重用传递到reduce中的key和value对象,因此应用程序应该克隆它们想要保留副本的对象。在许多情况下,所有值都合并为零或一个值


嗯?我真的不明白你建议的修复方法是什么,但是如果
迭代器
坏了,你就完蛋了,不是吗?有些迭代器每次都返回相同的对象。i、 e.每次调用values.next()时,实际上都会得到相同的对象(设置为不同的值),这通常被认为是混淆但合法的。下面是一个集合的示例,其entrySet()迭代器每次都在next()中返回相同的对象@幸运的是,我认为JDK7中修复了JDK集合对于每个迭代?每次的值是否相同?只是为了验证Peter的说法,确保每个对象都有不同的值,嗯?我真的不明白你建议的修复方法是什么,但是如果
迭代器
坏了,你就完蛋了,不是吗?有些迭代器每次都返回相同的对象。i、 e.每次调用values.next()时,实际上都会得到相同的对象(设置为不同的值),这通常被认为是混淆但合法的。下面是一个集合的示例,其entrySet()迭代器每次都在next()中返回相同的对象@幸运的是,我认为JDK7中修复了JDK集合对于每个迭代?每次的值是否相同?为了验证Peter的声明,只需确保每个对象得到不同的值。如果在此循环中转储
tmp
,它是否显示了您的期望?给定迭代器的操作方式是特定于提供它的类的实现;因此,为您提供迭代器的类在其设计中很可能存在缺陷。您提供给它的这个集合是标准java库的一部分,还是用户制作的?使用==运算符测试是否得到相同的实例。告诉我们测试的结果。@Puce Yes与CentralNodeNeighbory.get(0)相比,我从“==”操作符中得到每个tmp实例的true,但tmp对象中的数据不同,每次迭代。如果在这个循环中转储
tmp
,它是否显示了您的期望?给定迭代器的操作方式是特定于提供它的类的实现;因此,为您提供迭代器的类在其设计中很可能存在缺陷。您提供给它的这个集合是标准java库的一部分,还是用户制作的?使用==运算符测试是否得到相同的实例。告诉我们测试的结果。@Puce Yes与CentralNodeNeighbory.get(0)相比,我从“==”操作符中得到每个tmp实例的true,但每次迭代tmp对象中的数据都不同。
3
3
3
while (values.hasNext()) {
            Node tmp = values.next();
            System.out.print("Adding = "+tmp.toString());
            centralNodeNeighbourhood.add(tmp);
        }
public class GatherNodeNeighboursInfoReducer extends MapReduceBase
        implements Reducer<IntWritable, Node, NullWritable, NodeNeighbourhood>{
    public void reduce(IntWritable key, Iterator<Node> values,
                   OutputCollector<NullWritable, NodeNeighbourhood> output, Reporter reporter) throws IOException {...}
}