将Iterable <object>中的所有记录插入到java </object>中的List中

时间:2012-12-20 07:47:06

标签: java collections hadoop iterator

我有Iterable<MyRecord> records。我迭代下面的记录并将其添加到LinkedList,如下所示。

for (MyRecord record: records){
    sortedList.addLast(record);
}

我的iterable有3条记录,都有不同的值。但最终虽然sortedList包含3条记录,但所有三条记录都是相同的!!!怎么样?

当我打印出内存位置时,对所有人来说都是一样的3.我做错了什么?

4 个答案:

答案 0 :(得分:3)

实际上你的评论揭示了为什么会出错的缺失环节。您在Hadoop映射器或reducer中使用它。 Hadoop的诀窍在于它重用了你所进入的对象,因此在垃圾收集器上很容易。你需要做的是复制你的源迭代中的每个对象(MyRecord s),并将它们添加到你的LinkedList。

答案 1 :(得分:1)

如果sortedList包含相同的记录,这是原始记录中的最后一个元素,则迭代器可能会重用tmp引用。您需要检查“记录”的实现。

答案 2 :(得分:1)

您的问题很清楚,代码也是如此(在阅读评论后也是如此);这可能没有帮助,但也许你可以在添加之前做一个包含检查,例如:if (sortedList.contains(record)) sortedList.add...

我承认这可能不太有帮助(我也不知道是否包含对元素内存位置的检查,因为我猜它可能只使用equals检查列表中元素的存在。) / p>

答案 3 :(得分:0)

当您将项目添加到列表中时,请检查:

if(sortedList.contains(record))
{
  System.out.println("Record is already available "+record);
}
else
{
 sortedList.addLast(record);
}

您将了解问题是由于相同的记录还是由于其他原因。