Блог, который решает головоломку программирования ( частота слов ката) тремя способами. Цель состоит в том, чтобы сначала написать правильную программу, затем при каждом решении уменьшить общее количество строк программы.
Ката
Проблема имеет в качестве входных данных строку с символами, а в качестве выходных данных отображение, что ключ представляет собой символ и значение, как
пример ввода/вывода
ввод: “aaabb” вывод: {a: 3, b: 2}//в java map ключами являются a, b и соответствующие значения 3, 2
сигнатура метода
MapcomputeFrequencies(String input)
Решение 1 (не использовать функциональную java)
public static MapcomputeFrequenciesV1(String input) { Map result = new HashMap<>(); for (int index = 0 ; index < input.length(); index++) { char c = input.charAt(index); if (result.containsKey(c)) { Integer oldValue = result.get(c); result.put(c, ++oldValue); } else { result.put(c, 1); } } return result; }
объяснение решения
- Создание экземпляра карты (1 строка)
- классический для цикла с индексом (1 строка)
- получить текущий символ (1 строка)
- проверьте, содержится ли символ, если он содержится в карте (с помощью оператора if) (1 строка), если он есть, получите предыдущее значение счетчика и увеличьте его (!! обратите внимание на ++ как префикс, если вы запишете его как суффикс, счетчик не увеличит число) и поместите новое значение в карту (2 строки)
- в противном случае введите новый символ со значением 1 (3 строки, включая else и фигурные скобки).
- для завершения (1 строка)
- наконец, верните карту (1 строка)
общее количество строк решения : 11
Решение 2 (с функциональной java)
public static MapcomputeFrequenciesV2(String input) { Map result = new HashMap<>(); for (int index = 0 ; index < input.length(); index++) { char c = input.charAt(index); result.compute(c, (key, value) -> value == null ? value = 1 : ++value); } return result; }
объяснение решения
- Создание экземпляра карты (1 строка)
- классический для цикла с индексом (1 строка)
- получить текущий символ (1 строка)
- в этой строке используется метод вычисления (здесь происходит волшебство!). метод вычисления имеет два аргумента: Первый – это ключ к карте. Вторая – это функция (или функция Bi) с ключом и значением. Если есть значение, то это значение увеличилось, и это новое значение для ключа (символа). В противном случае значение (счетчик) инициализируется равным 1. (1 строка!!) 1 строка вместо 6 в первом решении
- фигурная скобка (1 строка)
- наконец, верните карту (1 строка)
решение всего строк : 6 из 11, неплохо и все еще читаемо Я думаю
Решение 3 (только функциональная java)
public static MapcomputeFrequenciesV3(String input) { return input.chars() .mapToObj(c -> (char) c) .collect(groupingBy(c -> c, Collectors.counting())); }
объяснение решения
- с помощью метода chars мы получаем IntStream
- с помощью mapToObj мы сопоставляем значение int с char
- наконец, используя метод collect с группировкой По, мы получаем нужную нам карту!
решение всего строк : 3, у нас есть победитель!
Группировка по объяснению:
- принимает два аргумента, первый указывает ключ группы (например, c -> c).
например (в нашем случае): “aaabb” ключи будут: a, b всего две группы
- второе – это действие, которое выполняется в группе. В конкретном ката действие заключается в подсчете (например, Collectors.counting()) элементов группы.
например (в нашем случае): “aaabb” в группе с “a” мы считаем три элемента, в то время как в группе “b” мы считаем два элемента.
Если вы не указали действие, у вас будет карта с двумя ключами и значениями:
ключ: ‘a’ значение: [‘a’, ‘a’, ‘a’]
ключ: “b” значение: [‘a’, ‘a’]
действие выполняется в списках (шаг сокращения).
Оригинал: “https://dev.to/konstantinosblatsoukasrepo/less-code-words-frequency-11kp”