Как получить самую частую гласную букву в строке

163
21 декабря 2019, 05:50

Написал такой код, но с его помощью я получаю число повторений буквы в строке, как получить саму букву? никак не могу сообразить

public String getMostCommonVowelFromString(String[] array) {        //найти самую частую гласную букву в строке
    String result;
    int a = 0;
    int e = 0;
    int i = 0;
    int o = 0;
    int u = 0;
    String s;
    for (int j = 0; j < array.length; j++) {
        s = array[j];
        Matcher m = Pattern.compile("([AaEeIiOoUu])").matcher(s);
        while (m.find()) {
            if (m.group().matches("[aA]")) {
                a++;
            } else if (m.group().matches("[eE]")) {
                e++;
            } else if (m.group().matches("[iI]")) {
                i++;
            } else if (m.group().matches("[oO]")) {
                o++;
            } else if (m.group().matches("[uU]")) {
                u++;
            }
        }
    }
    System.out.println("A - " + a);
    System.out.println("E - " + e);
    System.out.println("I - " + i);
    System.out.println("O - " + o);
    System.out.println("U - " + u);
    int[] sortedArray = new int[5];
    sortedArray[0] = a;
    sortedArray[1] = e;
    sortedArray[2] = i;
    sortedArray[3] = o;
    sortedArray[4] = u;
    Arrays.sort(sortedArray);
    result = String.valueOf(sortedArray[4]); //возвращает число а надо букву соответствующую этому числу
    return result;  //как вернуть имя переменной а не значение?
}
Answer 1

Задача достаточно тривиальна, но при этом Ваш код абсолютно нечитаемый. Представьте себе, что будет, когда сложность задачи возрастет в сотню раз... Посему предлагаю Вам сделать так:

private final static Set<Character> VOWEL_CHARS = Stream.of('A','a','E','e','I','i','O','o','U','u').collect(Collectors.toSet());
public Map <String, Long> getMostCommonVowelFromString(String[] array) {
    return Arrays.stream(array)
            .map(s -> s.chars().mapToObj(c -> (char)c).toArray(Character[]::new))
            .flatMap(a -> Arrays.stream(a))
            .filter(c->VOWEL_CHARS.contains(c))
            .collect(Collectors.groupingBy(ch -> String.valueOf(ch).toUpperCase(), Collectors.counting()));
}

Этот метод вернет вам коллекцию типа Map , где ключ - это буква, а значение - количество ее повторений.

Answer 2
Set<Character> vowels = "aeiou".chars()
                               .mapToObj(c -> (char) c)
                               .collect(Collectors.toSet());
String str = "Java 8 RulezZz";
Character mostFrequent = str.toLowerCase()
                            .chars()
                            .mapToObj(c -> (char) c)
                            .filter(vowels::contains)
                            .collect(Collectors.groupingBy(
                              Function.identity(),
                              Collectors.counting()))
                            .entrySet()
                            .stream()
                            .max(Map.Entry.comparingByValue())
                            .map(Map.Entry::getKey)
                            .get();
Answer 3

При сортировке соответствие символа и переменной теряется. Но сортировка и не нужна - достаточно найти максимальное значение из переменных a,e,i,o,u с помощью операторов сравнения и if

Кроме того, использование регулярных выражений для такой задачи несколько расточительно.

READ ALSO
Синхронизаниция по Integer в Java

Синхронизаниция по Integer в Java

Есть следующая учебная программка

147
Из активити не обновляется RecyclerView во фрагменте

Из активити не обновляется RecyclerView во фрагменте

При нажатии кнопки меню в MainActivity обновляются данные, изпользуемые в RecyclerViewСам рецайклер сидит во фрагменте, пытаюсь сообщить ему, что данные...

141
Вопрос по строковому методу length в java

Вопрос по строковому методу length в java

В примерах кода в своей книге ("Структуры данных и алгоритмы") Лафоре не пользуется методом lengthА отдельно объявляет дину массива, например...

149