Подсчет количества элементов в списке и добавление его в конец каждого элемента и поддержание порядка вставки в список для возврата? - PullRequest
1 голос
/ 15 марта 2020

Я работаю над проблемой и нуждаюсь в некоторых возможных подходах к ней.

Пример ввода:

["tv", "speaker", "tv", "radio", "radio", "tv"]

Пример вывода:

["tv", "speaker", "tv1", "radio", "radio1", "tv2"]

Добавьте число случаев, оставляя первое вхождение как есть.

До сих пор я добавил элементы в HashMap и использовал Collection.frequency / get put для количества элементов для подсчета количества элементов. Тем не менее, как можно добавить соответствующий номер в конце?

public class DeviceManagement {
    public static List<String> Solution(List<String> ls) {
        Map<String, Integer> map = new LinkedHashMap<>();
        int counter = 1;

        for (String str : ls) {
            if (map.containsKey(str)) {
                map.put(str, map.get(str) + 1);
            } else {
                map.put(str, counter);
            }
        }

        System.out.println(map);
        return null;
    }

    public static void main(String[] args) {
        List<String> ls = new ArrayList<>();
        ls.add("speaker");
        ls.add("tv");
        ls.add("radio");
        ls.add("toaster");
        ls.add("radio");
        ls.add("speaker");
        System.out.println(ls);
        System.out.println(Solution(ls));
    }
}

1 Ответ

0 голосов
/ 15 марта 2020

Ваш код правильно обнаруживает дубликаты и считает частоты, но не заменяет никакие элементы в 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...