iterable对arraylist元素的更改

sbtkgmzw  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(384)

因此,我正在实现一个mapreduce作业,这意味着我正在处理键值对。
我有变量

Iterable<FreqDataWritable> values

freqdatawritable是一个包含信息片段的对象,但现在我只关心它所包含的一个信息片段,即getfilename()访问的字符串。
我有以下循环:

ArrayList<String> filenames = new ArrayList<String>();

for(FreqDataWritable i : values) {
    filenames.add(i.getFilename());
}

现在我只想打印数组列表文件名中的值。

for(int i = 0; i < filenames.size(); i++) {
    System.out.println(filenames.get(i));
}

但是,当我这样做时,文件名中的所有内容都是相同的。唯一打印出来的是一个文件名,打印了多次。
我的原始代码比这个复杂,但我简化了它以获得帮助。有人知道怎么修吗?
谢谢

2hh7jdfx

2hh7jdfx1#

for(String filename : filenames) {
  System.out.println(fn);
}

让我知道这是否有用?

ig9co6j1

ig9co6j12#

我想出来了。hadoop有一个奇怪的内存使用情况,所以当我第一次迭代这些值时,它只是一次又一次地将相同的对象添加到arraylist中。
相反,我需要这样做:

for(FreqDataWritable i : values) {
    filenames.add(new String(i.getFilename()));
}
8fsztsew

8fsztsew3#

你试过基于迭代器的方法吗?

Iterator i = values.iterator();
fileNames.add(i.next().getFileName());
for(i; i.hasNext();) {
    String stringI = i.next().getLast().getFileName();
    if(!stringI.equals(fileNames.get(fileNames.size() - 1)))
        fileNames.add(i.next().getLast().getFileName());
}

相关问题