如何检查Java中的句子中有多少个辅音和元音?
Posted
技术标签:
【中文标题】如何检查Java中的句子中有多少个辅音和元音?【英文标题】:How can I check how many consonants and vowels there are in a sentence in Java? 【发布时间】:2014-07-25 18:43:54 【问题描述】:在循环结束时,我计划显示句子中辅音和元音的数量。我想知道是否有一种更有效的方法来检查给定句子中有多少个辅音和元音,而不是使用 if 语句并手动输入每个字母。 (key指的是我的Scanner,已经初始化)
编辑:它需要忽略数字和其他特殊字符,例如,如果我写 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;
【问题讨论】:
第一件事:摆脱那个丑陋的else if
。首先使用String#replaceAll()
删除所有不是字母的东西。如果一个字母不是元音,它一定是辅音,对吧?
@user3580294 如果它是数字或其他类型的字符,则不是。
你可以小写并使用字符类正则表达式,如果没有别的,尽管将这些操作包装在实用方法中会很好。
从技术上讲,他确实说过如果 字母 不是元音...
y 是辅音还是元音?这取决于语言...
【参考方案1】:
使用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++;
【讨论】:
【参考方案2】:怎么样
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】:我相信这可以改进,但无论如何我都会把它扔进擂台。 从句子中删除非字符,将其小写,然后转换为 char 数组,并将其与所有小写元音的 char 数组进行比较。
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));
【讨论】:
【参考方案4】:假设您已经有一个字母(元音或辅音,不是数字或符号或其他任何东西),那么您可以轻松创建一个方法来定义该字母是否为元音:
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)。
您可以使用Character#isLetter
轻松检查char
是否为字母。
所以,你的代码会变成:
for(check = 0; check < length; check++)
char a = words.charAt(check);
if (Character.isLetter(a))
if (isVowel(a))
v++;
else
c++;
【讨论】:
【参考方案5】:一种简单的方法是创建 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);
【讨论】:
【参考方案6】:您可以进行范围检查以确保它是一个字母,然后检查它是否是元音之一:
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】:哦,当然还有一种更易读的方法。不确定这是否符合“更好”的定义。
首先,我建议您将所拥有的内容封装到可以编写一次并在任何地方调用的方法中:
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://***.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;
【讨论】:
我很确定VOWEL_PATTERN_STR
在字符类中不需要 |
。 (?i)[aeiou]
本身应该工作。
真的 - 太快了。我会编辑。不明白为什么值得投反对票。【参考方案8】:
用空格分割字符串,并且只计算元音的数量。则辅音数 = 句长 - 元音数。
详细代码:
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);
【讨论】:
错误 - 可以有空格、数字、特殊字符。 好吧,没有人输入电话号码来分析元音和辅音的数量,而且这些错误可以通过适当的验证来消除......@duffymo OP 询问了一句话。我认为所有这些角色都是公平的游戏。这不是电话号码。【参考方案9】:一种方法是去掉非字母,然后去掉元音和辅音,得到剩下的长度:
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】:这是最好的方法:
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()));
【讨论】:
以上是关于如何检查Java中的句子中有多少个辅音和元音?的主要内容,如果未能解决你的问题,请参考以下文章
(高职专科组)第十一届蓝桥杯省模拟赛答案给定一个单词,请计算这个单词中有多少个元音字母,多少个辅音字母。
(高职专科组)第十一届蓝桥杯省模拟赛答案给定一个单词,请计算这个单词中有多少个元音字母,多少个辅音字母。