How can I check how many consonants and vowels there are in a sentence in Java?

↘锁芯ラ 提交于 2021-02-04 19:01:31

问题


At the end of my loop, I am planning on displaying the number of consonants and vowels in the sentence. I was wondering if there was a more efficient way to check how many consonants and vowels are in a given sentence, rather than using an if statement and manually inputting every letter. (key refers to my Scanner which has already been initialized)

Edit: It needs to ignore digits and other special characters, so for example if I write Hello@ how 1are you?. There should be 8 vowels and 6 consonants.

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;
}

回答1:


Use Character.isLetter(ch) to determine if the character is a vowel or a consonant, then check to see if the character in question is in the set of vowels.

One way to create the set of vowels:

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

And to increment v or c:

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



回答2:


How about something like

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++;
}



回答3:


I am sure this can be improved upon, but I'll throw it in the ring anyways. Remove non-characters from the sentence, lowercase it, then convert to a char array and compare it to a char array of vowels that are all lowercase.

String myText = "This is a sentence.";

    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));



回答4:


Assuming you already have a letter (vowel or consonant, not a digit nor a symbol or anything else), then you can easily create a method to define if the letter is a vowel:

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);
}

Note that I set Y and y as vowels since seems that they are in your language. In Spanish and English, Y is a consonant (AFAIK).

You can easily check if the char is a letter or not using Character#isLetter.

So, your code would become into:

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



回答5:


One easy way would be to create 2 lists:

  • one contains vowels (a, e, i, o, u)
  • the other contains consonants

Then you iterate over each character in the Java string.

See a sample below:

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);
    }
}



回答6:


You can do a range check to make sure it is a letter, then check if it one of the vowels:

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;
    }
}



回答7:


Oh, there's certainly a much more readable way to do it. Not sure if that meets the "better" definition.

As a start, I'd suggest that you encapsulate what you have into methods that you can write once and call anywhere:

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;
    }

}



回答8:


Split the String by whitespaces and and Calculate only the number of Vowels. Then Number of consonants = Length of Sentence - No. of Vowels.

Detailed Code:

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);



回答9:


One way to do it is to get rid of the non-letters, then vowels and consonants, and get the length of what is left:

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());
    }
}



回答10:


Here is the best way of doing this:

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()));
}


来源:https://stackoverflow.com/questions/24048907/how-can-i-check-how-many-consonants-and-vowels-there-are-in-a-sentence-in-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!