iterable对arraylist元素的更改

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

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

  1. Iterable<FreqDataWritable> values

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

  1. ArrayList<String> filenames = new ArrayList<String>();
  2. for(FreqDataWritable i : values) {
  3. filenames.add(i.getFilename());
  4. }

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

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

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

2hh7jdfx

2hh7jdfx1#

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

让我知道这是否有用?

ig9co6j1

ig9co6j12#

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

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

8fsztsew3#

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

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

相关问题