在java中将iterable< object>中的所有记录插入到列表中

ugmeyewa  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(347)

我有一个 Iterable<MyRecord> records . 我遍历下面这样的记录,并将其添加到linkedlist中,如下所示。
for (MyRecord record: records){ sortedList.addLast(record); }
我的iterable有3条记录,都有不同的值。但最后虽然 sortedList 包含3条记录,三条都一样!!!。怎么会?
当我打印出内存位置时,3个都是一样的。我做错什么了?

z31licg0

z31licg01#

如果sortedlist包含相同的记录,这是原始记录中的最后一个元素,那么迭代器有可能重用tmp引用。你需要检查“记录”的执行情况。

jecbmhm3

jecbmhm32#

实际上,你的评论揭示了为什么这会出错的缺失环节。您正在hadoopMap器或reducer中使用它。hadoop的诀窍在于,它重用了您正在获取的对象,这样就可以轻松地使用垃圾收集器。因此,您所要做的就是为源iterable(源iterable)中的每个对象创建一个副本 MyRecord s) ,并将其添加到linkedlist中。

t3psigkw

t3psigkw3#

将项目添加到列表时,请选中:

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

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

ehxuflar

ehxuflar4#

你的问题很清楚,代码也很清楚(同样在阅读评论之后);这可能没有帮助,但您可以在添加之前执行一个包含检查,如: if (sortedList.contains(record)) sortedList.add... 我承认这可能没有真正的帮助(我也不知道是否包含对引擎盖下的元素内存位置的检查,因为我猜它可能只会使用 equals ).

相关问题