Java: Копировать коллекцию с использованием Iterator - PullRequest
1 голос
/ 29 ноября 2011

У меня есть метод, который в качестве аргумента имеет итератор для коллекции.Внутри метода я хочу скопировать коллекцию, на которую итератор «указывает».Однако только последняя запись коллекции присутствует в копии коллекции, она присутствует 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
}

Пример "оригинальной коллекции":

1
2
3

Пример "centralNodeNeighbourhood collection":

3
3
3

Может кто-нибудь указать мне на мою ошибку?Я не могу изменить аргументы метода, я только получаю Iterator в коллекцию, ничего не могу с этим поделать.

ОБНОВЛЕНИЕ (Ответ на несколько вопросов)

while (values.hasNext()) {
            Node tmp = values.next();
            System.out.print("Adding = "+tmp.toString());
            centralNodeNeighbourhood.add(tmp);
        }

Печатает правильный оригиналэлементы коллекции.Я не знаю, какой тип является исходной коллекцией, но Iterator из 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 {...}
}

из OLD Hadoop api (версия Hadoop 0.20.203.0)

РЕШЕНО Я делал копию объекта tmp на каждой итерации и добавляю эту копию вцентральное собрание соседства.Это решило мою проблему.Спасибо за вашу (быструю) помощь.

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Похоже, что Итератор каждый раз возвращает один и тот же объект Node. Если это так, вам нужно взять копию узла, прежде чем добавить его в коллекцию. (В противном случае вы будете добавлять один и тот же объект каждый раз, и он будет иметь последние установленные значения)

1 голос
/ 29 ноября 2011

Метод Hadoop redu * указывает, что он повторно использует объекты-значения в своем итераторе.Это ужасная вещь, но это то, что она делает.

Фреймворк будет повторно использовать объекты ключа и значения, которые передаются в Reduce, поэтому приложение должно клонировать объекты, которые они хотят сохранить.копия.Во многих случаях все значения объединяются в ноль или одно значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...