我必须将一个句子作为输入,逐一从中提取每个单词并用它们打印各自的辅音计数。这是我正在使用的代码:
for(int i=0;i<l;i++)
{
count=0; word="";
if(sentence.charAt(i)!=' ')
{
word+=sentence.charAt(i);
}
else
{
for(int j=0;j<word.length();j++)
{
ch=word.charAt(i);
if (ch!='A'&&ch!='E'&&ch!='I'&&ch!='E'&&ch!='O'&&ch!='U')
{
count++;
}
}}
System.out.print(word+"\t"+count);}
我一直在尝试调试这个,我总是得到各种我不需要的输出。 我面临的两个主要问题是:
此外,我打算将提取的单词添加到String数组中,其索引等于其辅音计数。
StringArr[count]=" "+word;
如果两个以上的单词具有相同的辅音计数,我会在那里添加空格。
感谢任何帮助。
P.S.-我是这方面的新手,所以请随时指出我可能注意到的任何背景错误。
答案 0 :(得分:2)
如果您使用最简单的代码解决问题,那么您将拥有更少的代码,这通常会更容易理解,从而减少错误。
辅音的数量只是取消非辅音的长度:
int count = str.replaceAll("(?i)[^b-df-hj-np-tv-z]", "").length();
正则表达式解释:
(?i)
表示忽略大小写[^...]
是否定的字符类,即列表中没有的任何字符b-d
表示范围为b
至d
(含)的字符此代码也适用于边缘情况,而您的代码有错误;它会计算所有非元音和#34;作为一个辅音,但那也算撇号。考虑"can't"
有3个辅音。
使用上述内容,加上split()
来获取&#34;字&#34;:
for (String word : sentence.split("\\s+")) {
int count = str.replaceAll("(?i)[^b-df-hj-np-tv-z]", "").length();
System.out.println(word + '\t' + count);
}
使用流和内联计数,您可以在1个语句中执行:
Arrays.stream(sentence.split("\\s+"))
.forEach(w -> System.out.println(w + '\t' +
w.replaceAll("(?i)[^b-df-hj-np-tv-z]", "").length());
免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有合理的可能性)
答案 1 :(得分:0)
您可以使用String.split()方法获取单词,然后使用printf格式化字符串:
for (String word: sentence.split(" ")) {
System.out.printf("%10s: %d\n", word, getConsonantCount(word));
}
(有关格式化的详细信息,请查看printf的this cheatsheet)
现在,程序getConsonantCount()
的核心方法可以实现为:
public static int getConsonantCount(String word) {
word = word.toLowerCase();
int consonantCnt = 0;
for (int i = 0; i < word.length(); i++) {
char ch = word.charAt(i);
if (Character.isLetter(ch)) {
if (vowels.indexOf(ch) == -1) {
consonantCnt++;
}
}
}
return consonantCnt;
}
基本上,我们首先验证字符是否为字母,然后通过尝试在字符串vowels
中获取其索引来检查它是否是元音。如果计数器不是元音(因此是辅音),则递增计数器。
public static String vowels = "aeiou";
您尝试这样做的方式是一种有效的方法。但问题是您要为每个新角色重置count
和word
。
所以,考虑一下这个问题:我们应该在哪里重置这些变量?
当我们找到一个单词并进行处理时。它需要在 else 块中完成。此外,打印出来并在那里计算。 (现在,您在处理每个角色后进行打印)。
for (int i = 0; i < sentence.length(); i++) {
if(Character.isLetter(sentence.charAt(i))) {
word += sentence.charAt(i);
}
else if(sentence.charAt(i) == ' ') {
for(int j=0;j<word.length();j++) {
ch = Character.toUpperCase(word.charAt(j));
if (ch !='A' && ch != 'E' && ch != 'I' && ch!= 'E' && ch != 'O' && ch != 'U') {
count++;
}
}
System.out.printf("%10s: %d\n", word, count);
count = 0;
word ="";
}
}
这不会说到最后一个字。一种解决方案可能是预先在句子的末尾添加空格。
当您遇到空间时,您可以只计算辅音,而不是构建单词然后再处理它。
count = 0;
int start = 0;
for (int i = 0; i < sentence.length(); i++) {
if (Character.isLetter(sentence.charAt(i))) {
ch = Character.toUpperCase(sentence.charAt(i));
if (ch != 'A' && ch != 'E' && ch != 'I' && ch != 'E' && ch != 'O' && ch != 'U') {
count++;
}
} else if (sentence.charAt(i) == ' ') {
System.out.printf("%10s: %d\n", sentence.substring(start, i), count);
start = i + 1;
count = 0;
}
}
此处,变量start
会跟踪当前单词的开头。
对于stringArray
变量,请考虑将其设为Map。