我必须将句子中每个单词的第一个字符大写。第一个单词的第一个字符是大写的,句子只能用句号或问号终止。然后我必须在句子的每个单词中计算所有元音和辅音。
这是我的代码:
import java.io.*;
import java.util.*;
class ISC_Prac_2015
{
String s;
ISC_Prac_2015()
{
s="";
}
void input()throws IOException
{
System.out.println("Enter a sentence :");
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
s=buf.readLine();
if(!((s.charAt(s.length()-1)=='.'||s.charAt(s.length()-1)=='?')))
{
System.out.println("Invalid input.");
System.exit(0);
}
}
char changeToUpper(char c)
{
return Character.toUpperCase(c);
}
boolean isVowel(char c)
{
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'||c=='A'||c=='E'||c=='I'||c=='O'||c=='U')
return true;
else
return false;
}
void main()throws IOException
{
input();
String s2=s.substring(0,s.length()-1);
StringBuffer s3=new StringBuffer(s2);
for(int x=0;x<s3.length()-1;x++)
if(s3.charAt(x)==' ')
s3.setCharAt(x+1,changeToUpper(s3.charAt(x+1)));
String s4=s3.toString();
System.out.println("\n"+s4);
StringTokenizer st=new StringTokenizer(s4);
String a[]=new String[st.countTokens()];
for(int x=0;x<st.countTokens();x++)
a[x]=st.nextToken();
/*replace the 4 lines above with String a[]=s4.split(" ");
and the program works, but why?*/
System.out.println("Word\t\t"+"Vowels\t\t"+"Consonants");
int vowel=0,consonant=0;
for(int x=0;x<a.length;x++)
{
for(int y=0;y<a[x].length();y++)
if(isVowel(a[x].charAt(y)))
vowel++;
else
consonant++;
if(a[x].length()<8)
System.out.println(a[x]+"\t\t"+vowel+"\t\t"+consonant);
else if(a[x].length()>=8&&a[x].length()<16)
System.out.println(a[x]+"\t"+vowel+"\t\t"+consonant);
else
System.out.println(a[x]+vowel+"\t\t"+consonant);
}
}
}
班级名称很奇怪,因为这是我计算机考试中提出的问题。
该计划有些工作,但由于某种原因我在NullPointerException
的内部for
循环中获得main()
。但是,正如我在程序中评论过的那样,如果我使用split(" ")
函数,程序就可以正常工作。
但为什么呢?不是StringTokenizer
与split(" ")
做同样的事情吗?
答案 0 :(得分:4)
StringTokenizer的countTokens方法的API文档说:
计算此tokenizer的nextToken方法的次数 可以在生成异常之前调用它。目前的立场 没进展。
你在for循环中调用它就像你期望它保持不变一样,但每次你用另一个标记前进时它会减少1。因此,如果你的字符串有4个令牌,你只能得到前两个。你的字符串数组中留有空值。
您可以使用调试器或在代码中添加printlns来检查此类事情。
有几种解决方案。您可以修复代码以预先存储令牌计数,而不是继续调用该方法。更好的是,hasMoreTokens方法就是针对这种情况,使用它。或者您可以按照文档中的建议进行操作:
StringTokenizer是为保持兼容性而保留的旧类 原因虽然在新代码中不鼓励使用它。建议 任何寻求此功能的人都使用String的split方法 或者改为java.util.regex包。
查看文档。当某些事情的行为不像您认为的那样时,请仔细检查文档,看看您的假设是否真的有效。
答案 1 :(得分:-1)
要将每个字词大写,您可以使用WordUtils.capitalize(str)中的Apache Lang。
元素和辅音计数技术可以在SO this thread中找到。