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



В конце цикла я планирую показать количество согласных и гласных в предложении. Мне было интересно, есть ли более эффективный способ проверить, сколько согласных и гласных в данном предложении, а не использовать оператор if и вручную вводить каждую букву. (ключ относится к моему сканеру, который уже был инициализирован)



Edit: он должен игнорировать цифры и другие специальные символы, поэтому, например, если я напишу Hello@ how 1are you?. Так и должно быть. 8 гласных и 6 согласных.



System.out.println("Please enter the sentence to analyze: ");

String words = key.nextLine(); //the sentence the user inputs
int c = 0; //# of consonants
int v = 0; //# of vowels
int length = words.length(); //length of sentence
int check; //goes over each letter in our sentence

for(check = 0; check < length; check++){
char a = words.charAt(check);

if(a == 'a' || a == 'A' || a == 'e' || a == 'E' || a == 'i' || a == 'I' || a == 'o'
|| a == 'O' || a == 'u' || a == 'U' || a == 'y' || a == 'Y')
v = v + 1;
else if(a == 'b' || a == 'B' || a == 'c' || a == 'C' || a == 'd' || a == 'D' || a == 'f'
|| a == 'F' || a == 'g' || a == 'G' || a == 'h' || a == 'H' || a == 'j' || a == 'J'
|| a == 'k' || a == 'K' || a == 'l' || a == 'L' || a == 'm' || a == 'M' || a == 'n'
|| a == 'N' || a == 'p' || a == 'P' || a == 'q' || a == 'Q' || a == 'r' || a == 'r'
|| a == 's' || a == 'S' || a == 't' || a == 'T' || a == 'v' || a == 'V' || a == 'w'
|| a == 'W' || a == 'x' || a == 'X' || a == 'z' || a == 'Z')
c = c + 1;
}
2174   10  

10 ответов:

Используйте Character.isLetter(ch), чтобы определить, является ли символ гласным или согласным, а затем проверьте, входит ли данный символ в набор гласных.

Один из способов создания набора гласных:

    Set<Character> vowels = new HashSet<Character>();
    for (char ch : "aeiou".toCharArray()) {
        vowels.add(ch);
    }

И увеличить v или c:

    if (Character.isLetter(a)) {
        if (vowels.contains(Character.toLowerCase(a))) {
            v++;
        } else {
            c++;
        }
    }

Я уверен, что это можно улучшить, но я все равно брошу его в кольцо. Удалите несимволы из предложения, постройте его в нижнем регистре,затем преобразуйте в массив символов и сравните его с массивом символов гласных, которые все являются строчными.

String myText = " это предложение.";

    int v = 0;

    char[] vowels = {'a','e','i','o','u'};
    char[] sentence = myText.replaceAll("[^a-zA-Z]","").toLowerCase().toCharArray();

    for (char letter : sentence) {
        for (char vowel : vowels) {
            if (letter == vowel) {
                v++;
            }
        }
    }
    System.out.println("Vowels:"+ v);
    System.out.println("Consonants:" + (sentence.length -v));

Предполагая, что у вас уже есть буква (гласная или согласная, а не цифра, символ или что-то еще), вы можете легко создать метод для определения, является ли буква гласной:

static final char[] vowels = { 'a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U', 'y', 'Y' };

public static boolean isVowel(char c) {
    for (char vowel : vowels) {
        if (c == vowel) {
            return true;
        }
    }
    return false;
}

public static boolean isConsonant(char c) {
    return !isVowel(c);
}
Обратите внимание, что я установил Y и y как гласные, так как кажется, что они находятся в вашем языке. В испанском и английском языках Y является согласным (AFAIK).

Вы можете легко проверить, является ли char буквой или нет.Character#isLetter.

Итак, ваш код превратится в:

for(check = 0; check < length; check++){
    char a = words.charAt(check);
    if (Character.isLetter(a)) {
        if (isVowel(a)) {
            v++;
        } else {
            c++;
        }
    }
}

Как насчет чего-то вроде

String vowels = "aeiouyAEIOUY"; // you can declare it somewhere before loop to 
                                // to avoid redeclaring it each time in loop

//inside loop
if ((a>='a' && a<='z') || (a>='A' && a<='Z')){ //is letter
    if (vowels.indexOf(a)!=-1)                 //is vowel
        v++;
    else                                       //is consonant
        c++;
}

Одним из простых способов было бы создать 2 списка:

    Один содержит гласные (a, e, i, o, u)
  • другой содержит согласные

Затем вы повторяете каждый символ в строке Java.

Смотрите пример ниже:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Counter {
    public static void main(String[] args) {
        String test = "the fox is in the woods";
                    test = test.toLowerCase();
        List<Character> vowels = new ArrayList<Character>();
        vowels.addAll(Arrays.asList(new Character[]{'a', 'e', 'i', 'o', 'u'}));
        List<Character> consonants = new ArrayList<Character>();
        consonants.addAll(Arrays.asList(new Character[]{'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z'}));
        int vcount = 0;
        int ccount = 0;
        for (int i = 0; i < test.length(); i++){
            Character letter = test.charAt(i);
            if (vowels.contains(letter)){
                vcount ++;
            } else if (consonants.contains(letter)){
                ccount++;
            }
        }

        System.out.println(vcount);
        System.out.println(ccount);
    }
}

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

if( ( a >= 'a' && a<= 'z' ) || ( a >= 'A' && a <= 'Z' ) )
{
    // is letter
    switch( a )
    {
        case 'a': case 'A':
        case 'e': case 'E':
        case 'i': case 'I':
        case 'o': case 'O':
        case 'U': case 'u':
             ++v;
             break;
        default: // don't list the rest of the characters since we did the check in the if statement above.
             ++c;
    }
}

О, конечно, есть гораздо более читаемый способ сделать это. Не уверен, что это соответствует определению "лучше".

Для начала я бы предложил вам инкапсулировать то, что у вас есть, в методы, которые вы можете написать один раз и вызвать в любом месте:
package misc;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * ParseUtils get counts of vowels and consonants in sentence
 * @author Michael
 * @link https://stackoverflow.com/questions/24048907/how-can-i-check-how-many-consonants-and-vowels-there-are-in-a-sentence-in-java
 * @since 6/4/2014 6:57 PM
 */
public class ParseUtils {

    private static final String VOWEL_PATTERN_STR = "(?i)[aeiou]";
    private static final Pattern VOWEL_PATTERN = Pattern.compile(VOWEL_PATTERN_STR);
    private static final String CONSONANT_PATTERN_STR = "(?i)[b-df-hj-np-tv-z]";
    private static final Pattern CONSONANT_PATTERN = Pattern.compile(CONSONANT_PATTERN_STR);

    private ParseUtils() {}

    public static void main(String[] args) {
        for (String arg : args) {
            System.out.println(String.format("sentence: '%s' # letters: %d # vowels: %d # consonants %d", arg, arg.length(), getNumVowels(arg), getNumConsonants(arg)));
        }
    }

    public static int getNumVowels(String sentence) {
        return getMatchCount(sentence, VOWEL_PATTERN);
    }

    public static int getNumConsonants(String sentence) {
        return getMatchCount(sentence, CONSONANT_PATTERN);
    }

    private static int getMatchCount(String s, Pattern p) {
        int numMatches = 0;
        if ((p != null) && (s != null) && (s.trim().length() > 0)) {
            Matcher m = p.matcher(s);
            while (m.find()) {
                ++numMatches;
            }
        }
        return numMatches;
    }

}

Разбейте строку на пробелы и вычислите только количество гласных. Тогда число согласных = длина предложения-нет. из гласных.

Подробный Код:

System.out.println("Please enter the sentence to analyze: ");
int v = 0;
int c = 0;
String string = key.nextLine(); //the sentence the user inputs
String[] stringArray = string.split(" ");
for(int i=0;i<stringArray.length;i++)
  {
     for(int j= 0; j<string.length(); j++)
      {
      char a = string.charAt(j);   

    if(a == 'a' || a == 'A' || a == 'e' || a == 'E' || a == 'i' || a == 'I' || a == 'o'
        || a == 'O' || a == 'u' || a == 'U' || a == 'y' || a == 'Y')
        v = v + 1;
      }
        c= c+(stringArray.length)-v;
  }

System.out.println("Vowels:"+v+"  and Consonants:"+c);

Один из способов сделать это-избавиться от Не букв , затем гласных и согласных и получить длину того, что осталось:

public class CountChars {
    public static final String CONSONANTS = "[BCDFGHJKLMNPQRSTVWXYZ]";
    public static final String VOWELS = "[AEIOU]"; // considering Y a consonant here
    public static final String NOT_LETTERS = "[\\W_0-9]";

    public static void main(String[] args) {
        String words = "How can I check how many consonants and vowels there are in a sentence in Java?";

        String letters = words.toUpperCase().replaceAll(NOT_LETTERS, "");
        System.out.println("Letters: " + letters.length());

        String vowels = letters.replaceAll(CONSONANTS, "");
        System.out.println("Vowels: " + vowels.length());

        String consonants = letters.replaceAll(VOWELS, "");
        System.out.println("Consonants: " + consonants.length());
    }
}

Вот лучший способ сделать это:

public static void checkVowelsAndConsonants(String s){
    System.out.println("Vowel Count: " + (s.length() - s.toLowerCase().replaceAll("a|e|i|o|u|", "").length()));
    //Also eliminating spaces, if any for the consonant count
    System.out.println("Consonant Count: " + (s.toLowerCase().replaceAll("a|e|i|o| |u", "").length()));
}

Comments

    Ничего не найдено.