Ну, вы хотите удалить дубликаты, которые были отображены, то есть вы хотите уменьшить список промежуточных значений до списка вывода без дубликатов. Лучше всего было бы просто преобразовать Iterator<Text>
в методе reduce()
в java Set
и выполнить итерацию по нему, изменив:
while (values.hasNext()) {
if (!first)
toReturn.append(", ") ;
first = false;
toReturn.append(values.next().toString());
}
На что-то вроде:
Set<Text> valueSet = new HashSet<Text>();
while (values.hasNext()) {
valueSet.add(values.next());
}
for(Text value : valueSet) {
if(!first) {
toReturn.append(", ");
}
first = false;
toReturn.append(value.toString());
}
К сожалению, я не знаю лучшего (более краткого) способа преобразования Итератора в Набор.
Это должно иметь меньшую временную сложность, чем решение Orange, но более высокое потребление памяти.
@ Редактировать: немного короче:
Set<Text> valueSet = new HashSet<Text>();
while (values.hasNext()) {
Text next = values.next();
if(!valueSet.contains(next)) {
if(!first) {
toReturn.append(", ");
}
first = false;
toReturn.append(value.toString());
valueSet.add(next);
}
}
Содержит должно быть (как добавить) постоянное время, поэтому теперь оно должно быть O (n).