Возможность изменения элементов ArrayList

1

Поэтому я выполняю работу 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));
}

Однако, когда я делаю это, все в именах файлов одинаково. Единственное, что напечатано, это одно имя файла, напечатанное несколько раз.

Мой оригинальный код более сложный, чем этот, но я упростил его для помощи. Кто-нибудь знает, как это исправить?

благодаря

Теги:
arraylist
hadoop
mapreduce
iterable

3 ответа

2
Лучший ответ

Я понял. У Hadoop есть нечетное использование памяти, поэтому, когда я повторил эти значения, первый раз он просто добавлял один и тот же объект снова и снова к arraylist.

Вместо этого мне нужно сделать это:

for(FreqDataWritable i : values) {
    filenames.add(new String(i.getFilename()));
}
  • 0
    спасибо за спасение моей жизни, застрял в одном выпуске на неделю
  • 0
    Не могли бы вы поделиться некоторыми подробностями / ссылками на использование памяти, на которое вы ссылаетесь? Я застрял с подобной проблемой, и я хотел бы узнать больше об этом. Хотя этот ответ является решением, выполнение этого для сложных объектов может стать раздражающим, как и в моем случае.
Показать ещё 1 комментарий
1

Вы пробовали использовать метод, основанный на итераторе?

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());
}
  • 0
    Я получаю те же значения, используя этот подход, а также.
1
for(String filename : filenames) {
  System.out.println(fn);
}

Дайте мне знать, если это поможет?

  • 0
    Нет, похоже, это тоже не работает. Однако я заметил, что последний элемент массива - это тот, который печатается несколько раз.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню