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

public static int count_Vowels(String str) {
    str = str.toLowerCase();
    int count = 0;
    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == 'a' || str.charAt(i) == 'e' || str.charAt(i) == 'i'
                || str.charAt(i) == 'o' || str.charAt(i) == 'u') {
            count++;
        }
    }
    return count;
}
1
Ramsey 28 Фев 2018 в 23:32

7 ответов

Лучший ответ

Я хотел бы начать с пяти переменных (по одной для каждого гласного), для которых установлено 0, итерировать символы на входе и установить для соответствующей переменной значение 1, если я найду совпадение, и просто вернуть накопленное значение указанные переменные. Подобно,

public static int count_Vowels(String str) {
    int a = 0, e = 0, i = 0, o = 0, u = 0;
    for (char ch : str.toLowerCase().toCharArray()) {
        if (ch == 'a') {
            a = 1;
        } else if (ch == 'e') {
            e = 1;
        } else if (ch == 'i') {
            i = 1;
        } else if (ch == 'o') {
            o = 1;
        } else if (ch == 'u') {
            u = 1;
        }
    }
    return a + e + i + o + u;
}
6
Elliott Frisch 28 Фев 2018 в 20:41

Вы можете использовать Установить структуру данных и вместо увеличения счетчика просто добавить гласные в набор. В конце вы можете вернуть только размер набора.

2
amalgamat 28 Фев 2018 в 20:35

Проблема в вашем коде состоит в том, что вы считаете не отдельные гласные, а все гласные в строке. Java-8 способ этого:

public static int countDistinctVowels(String str) {
    str = str.toLowerCase();
    int count = (int) str.chars()                     // get IntStream of chars
            .mapToObj(c -> (char) c)                  // cast to char
            .filter(c -> "aeiou".indexOf(c) > -1)     // remove all non-vowels
            .distinct()                               // keep the distinct values
            .count();                                 // count the values

    return count;
}

Также используйте правильные соглашения об именах Java: countDistinctVowels, нет count_Distinct_Vowels.

1
Juan Carlos Mendoza 28 Фев 2018 в 21:09

Здесь определенно есть проблема с этим подсчетом. по крайней мере. Вы должны переосмыслить это:

if (str.charAt(i) == 'a' || str.charAt(i) == 'e' || str.charAt(i) == 'i'
                || str.charAt(i) == 'o' || str.charAt(i) == 'u')

            count++;
0
user3335083user3335083 28 Фев 2018 в 20:37

Вы можете использовать метод contains

public static int count_Vowels(String str) {
    str = str.toLowerCase();
    int count = 0;
    count += string.contains("a") ? 1 : 0;
    count += string.contains("e") ? 1 : 0;
    count += string.contains("i") ? 1 : 0;
    count += string.contains("o") ? 1 : 0;
    count += string.contains("u") ? 1 : 0;
    return count;
}
0
Moriz Martiner 28 Фев 2018 в 20:59

Я сделал пояснения в комментариях к коду:

public static int count_Vowels(String str) {
        str = str.toLowerCase();
        Set<Character> setOfUsedChars = new HashSet<>(); // Here you store used vowels
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == 'a' || str.charAt(i) == 'e' || str.charAt(i) == 'i'
                    || str.charAt(i) == 'o' || str.charAt(i) == 'u') { // if currently checked character is vowel...
                setOfUsedChars.add(str.charAt(i)); // add this vowel to setOfUsedChars
            }
        }
        return setOfUsedChars.size(); // size of this sets is a number of vowels present in input String
}
0
Przemysław Moskal 28 Фев 2018 в 21:00
static void vow(String input){          
    String output=input.toLowerCase();
    int flaga=0,flage=0,flagi=0,flago=0,flagu=0;
    for(int i=0;i<input.length();i++) {
        if((output.charAt(i))=='a' && flaga==0) {
            System.out.print(input.charAt(i)+" ");
            flaga++;
        }
        if(output.charAt(i)=='e' && flage==0) {
            System.out.print(input.charAt(i)+" ");
            flage++;
        }
        if(output.charAt(i)=='i' && flagi==0) {
            System.out.print(input.charAt(i)+" ");
            flagi++;
        }
        if(output.charAt(i)=='o' && flago==0) {
            System.out.print(input.charAt(i)+" ");
            flago++;
        }
        if(output.charAt(i)=='u' && flagu==0) {
            System.out.print(input.charAt(i)+" ");
            flagu++;
        }
    }
}
0
Shoeb Shaul 26 Апр 2019 в 19:30