подсчет гласных и согласных при условии, что в строке могут содержаться буквы кириллицы в нижнем регистре и пробелы
Добра! мне нужно подсчитать количество гласных и согласных букв, при условии, что в строке могут содержаться буквы кириллицы в нижнем регистре и пробелы. сам смог написать лишь такую околесицу, буду благодарен если поможете
Scanner in = new Scanner(System.in);
String str = in.nextLine();
String[] strr = str.split("");
var glas = "йуеыаоэяию";
var sogl = "цкнгшщзхъфвпрлджчсмтьб";
String[] glass = glas.split("");
String[] sogll = sogl.split("");
int count_q = 0; int vount_s = 0;
for (int i = 0; i < str.length(); i++) {
for (int j = strr.length - 1; j >= 0; j--) {
System.out.println(strr[i]);
if (strr[i] == glass[i]) count_q++;
if (strr[i] == sogll[i]) vount_s++;
}
}
System.out.println(count_q + " " + vount_s);
Ответы (2 шт):
Лучше конечно же разбивать по словам, а не искать во всей строке.
String inString="Труффальдино из Бергамо";
List russainVowels = new ArrayList<>(Arrays.asList('А', 'Е', 'Ё', 'И', 'О', 'У', 'Ы', 'Э', 'Ю', 'Я', 'а', 'е',
'ё', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я'));
List russainСonsonants = new ArrayList<>(Arrays.asList('Б', 'В', 'Г', 'Д', 'Ж', 'З', 'Й', 'К', 'Л', 'М', 'Н',
'П', 'Р', 'С', 'Т', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'б', 'в', 'г', 'д', 'ж', 'з', 'й', 'к', 'л', 'м', 'н',
'п', 'р', 'с', 'т', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ь'));
List total = inString.chars().mapToObj(e->(char)e).collect(Collectors.toList());
total.retainAll(russainVowels);//для длясных, для согласных подставить russainСonsonants
int result = total.size();
Предположим, что хэшсетами вам пользоваться запрещено, а считать количества гласных и согласных всё-таки надо. Идея воспользоваться вложенными циклами в принципе верна, проблема только в том, что в Java нельзя в общем случае сравнивать строки при помощи оператора ==, а вот символы можно.
Также можно заменить внутренний цикл, проверяющий гласные буквы, на стандартный метод String::indexOf, возвращающий -1, если символ не был обнаружен.
Если входные данные гарантированно содержат только русскую кириллицу в нижнем регистре и пробелы, для определения типа букв достаточно использовать только строку с гласными, отсортированными по убыванию их частоты:
Scanner in = new Scanner(System.in);
String str = in.nextLine().toLowerCase(); // гарантировать нижний регистр
String vowels = "оеаиуяыюэё";
int cons = 0, vows = 0;
for (char c : str.toCharArray()) {
if (c == ' ') {
continue; // пропустить пробелы
}
if (vowels.indexOf(c) != -1) { // найдена гласная
vows++;
} else { // иначе согласная
cons++;
}
}
System.out.println("Гласных: " + vows + "; coгласных: " + cons);
Для "ускорения" вместо String::indexOf можно воспользоваться оператором switch:
//...
if (c == ' ') {
continue; // пропустить пробелы
}
switch (c) {
case 'о','е','а','и','у','я','ы','ю','э','ё' -> vows++;
default -> cons++;
}
Пример с использованием хэшсета для гласных, и Stream API, в частности Collectors.partitioningBy для разбиения букв на гласные/согласные и Collectors.summingInt / Collectors.counting для подсчёта частот букв определённого вида:
static void printStats(String str) {
var vowels = Set.of('о','е','а','и','у','я','ы','ю','э','ё');
var counts = str.toLowerCase()
.chars()
.filter(c -> c != ' ')
.mapToObj(c -> (char) c)
.collect(Collectors.partitioningBy(
vowels::contains, Collectors.summingInt(x -> 1)
));
System.out.println("Гласных: " + counts.get(true) + "; coгласных: " + counts.get(false));
}
Вариант с удалением ненужных символов при помощи String.replaceAll и наборов символов:
static void printStats2(String str) {
// оставить русскую кириллицу
String letters = str.toLowerCase().replaceAll("[^а-яё]+", "");
// убрать гласные
String cons = letters.replaceAll("[оеаиуяыюэё]", "");
System.out.println("Гласных: " + (letters.length() - cons.length()) + "; coгласных: " + cons.length());
}