Рубрики
Без рубрики

меньше кода (частота слов)

Блог, который решает головоломку программирования (ката частоты слов) тремя способами. Цель состоит в том, чтобы сначала написать… Помеченный java.

Блог, который решает головоломку программирования ( частота слов ката) тремя способами. Цель состоит в том, чтобы сначала написать правильную программу, затем при каждом решении уменьшить общее количество строк программы.

Ката

Проблема имеет в качестве входных данных строку с символами, а в качестве выходных данных отображение, что ключ представляет собой символ и значение, как

пример ввода/вывода

ввод: “aaabb” вывод: {a: 3, b: 2}//в java map ключами являются a, b и соответствующие значения 3, 2

сигнатура метода

Map computeFrequencies(String input)

Решение 1 (не использовать функциональную java)

    public static Map computeFrequenciesV1(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 строка)
  2. классический для цикла с индексом (1 строка)
  3. получить текущий символ (1 строка)
  4. проверьте, содержится ли символ, если он содержится в карте (с помощью оператора if) (1 строка), если он есть, получите предыдущее значение счетчика и увеличьте его (!! обратите внимание на ++ как префикс, если вы запишете его как суффикс, счетчик не увеличит число) и поместите новое значение в карту (2 строки)
  5. в противном случае введите новый символ со значением 1 (3 строки, включая else и фигурные скобки).
  6. для завершения (1 строка)
  7. наконец, верните карту (1 строка)

общее количество строк решения : 11

Решение 2 (с функциональной java)

    public static Map computeFrequenciesV2(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 строка)
  2. классический для цикла с индексом (1 строка)
  3. получить текущий символ (1 строка)
  4. в этой строке используется метод вычисления (здесь происходит волшебство!). метод вычисления имеет два аргумента: Первый – это ключ к карте. Вторая – это функция (или функция Bi) с ключом и значением. Если есть значение, то это значение увеличилось, и это новое значение для ключа (символа). В противном случае значение (счетчик) инициализируется равным 1. (1 строка!!) 1 строка вместо 6 в первом решении
  5. фигурная скобка (1 строка)
  6. наконец, верните карту (1 строка)

решение всего строк : 6 из 11, неплохо и все еще читаемо Я думаю

Решение 3 (только функциональная java)

    public static Map computeFrequenciesV3(String input) {
        return input.chars()
                .mapToObj(c -> (char) c)
                .collect(groupingBy(c -> c, Collectors.counting()));
    }

объяснение решения

  1. с помощью метода chars мы получаем IntStream
  2. с помощью mapToObj мы сопоставляем значение int с char
  3. наконец, используя метод 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”