Поэтому я выполняю работу 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));
}
Однако, когда я делаю это, все в именах файлов одинаково. Единственное, что напечатано, это одно имя файла, напечатанное несколько раз.
Мой оригинальный код более сложный, чем этот, но я упростил его для помощи. Кто-нибудь знает, как это исправить?
благодаря
Я понял. У Hadoop есть нечетное использование памяти, поэтому, когда я повторил эти значения, первый раз он просто добавлял один и тот же объект снова и снова к arraylist.
Вместо этого мне нужно сделать это:
for(FreqDataWritable i : values) {
filenames.add(new String(i.getFilename()));
}
Вы пробовали использовать метод, основанный на итераторе?
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());
}
for(String filename : filenames) {
System.out.println(fn);
}
Дайте мне знать, если это поможет?