2011-11-29 75 views
1

我有一個方法,它作爲參數具有集合的迭代器。在我想要複製集合的方法中,迭代器「指向」。 但是隻有最後一個收集條目出現在收集副本中,它存在N次,其中N是原始收集的大小。Java:使用迭代器複製集合

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 
} 

的Exemplar 「原始集合」:

1 
2 
3 

的Exemplar 「centralNodeNeighbourhood集」:

3 
3 
3 

有人點我到我的錯誤?我不能改變方法的參數,我只把Iterator拿到集合中,對此無能爲力。

UPDATE(回答一些問題)

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

打印正確的原始集合的元素。 我不知道原始集合是什麼類型,但迭代器來自std java。該方法是從OLD Hadoop的API(Hadoop的版本0.20.203.0)的

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 {...} 
} 

方法

解決 我在每次迭代由TMP對象的副本,並且我此副本添加到centralNodeNeighbourhood集合。這解決了我的問題。 Thx爲您的所有(快速)幫助。

+0

如果您在此循環中轉儲'tmp',是否顯示您期望的內容? –

+1

給定的迭代器如何操作是針對提供它的類的實現特定的;因此,爲您提供迭代器的類可能在其設計中存在錯誤。這個集合是你給它的標準java庫的一部分,還是用戶製作的? – djhaskin987

+0

測試您是否使用==運算符獲得相同的實例。告訴我們測試的結果。 – Puce

回答

3

看來Iterator每次都返回相同的Node對象。如果是這樣,您需要先將節點的副本添加到集合中。 (否則,您將每次添加相同的對象,並且它將具有設置爲的最後一個值)

+2

咦?我不明白你的建議是什麼,但如果'Iterator'壞了,你就搞砸了,不是嗎? – erickson

+2

一些迭代器每次都返回相同的對象。即每次調用values.next()時,實際上都會獲得相同的對象(設置爲不同的值)。通常會認爲混淆但合法。 –

+0

下面是一個集合的示例,其中entrySet()迭代器每次都在Next()中返回相同的對象。 HTTP://tech.puredanger。com/2009/06/11/collections-puzzler/ –

1

Hadoop的reduce方法指定它在其迭代器中重新使用值對象。這是一件可怕的事情,但這就是它的作用。

該框架將重用傳遞到reduce的鍵和值對象,因此應用程序應克隆他們想要保留副本的對象。在許多情況下,所有值都合併爲零或一個值。