Ваш код правильно обнаруживает дубликаты и считает частоты, но не заменяет никакие элементы в List
их новыми значениями, пока вы выполняете итерации по нему. Чтобы сделать это проще, я рекомендую использовать List#replaceAll
вместо for-l oop. Ваш код будет выглядеть примерно так:
public static List<String> solution(List<String> ls) {
Map<String, Integer> map = new HashMap<>();
ls.replaceAll(element -> {
if (map.containsKey(element)) {
int oldAmount = map.put(element, map.get(element) + 1);
return element + oldAmount;
} else {
map.put(element, 1);
return element;
}
});
return ls;
}
В результате вы получите:
[speaker, tv, radio, toaster, radio1, speaker1]
Чтобы немного упростить код, вы можете использовать Map#merge
:
public static List<String> solution(List<String> ls) {
Map<String, Integer> map = new HashMap<>();
ls.replaceAll(element -> {
int newValue = map.merge(element, 1, Integer::sum);
return newValue == 1 ? element : element + (newValue - 1);
});
return ls;
}
Если вы хотите вернуть другой объект List
, то вы можете передавать свои входные данные, отобразить их и собрать для другого List
:
public static List<String> solution(List<String> ls) {
Map<String, Integer> map = new HashMap<>();
return ls.stream().map(element -> {
int newValue = map.merge(element, 1, Integer::sum);
return newValue == 1 ? element : element + (newValue - 1);
}).collect(Collectors.toList());
}