当前位置: 首页 > 知识库问答 >
问题:

程序中的StringTokenizer与split()

郑光济
2023-03-14

我必须把句子中每个单词的第一个字符大写。第一个单词的第一个字符是大写的,句子只能以句号或问号结尾。然后我要数一数句子中每个单词的元音和辅音。

这是我的代码:

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

这个类名很奇怪,因为这是我计算机考试中问的一个问题。

程序在某种程度上正常工作,但由于某种原因,我在main()中的循环的内部上得到了一个nullpointereexception。但是,正如我在程序中所评论的那样,如果我使用分裂(“”)函数,程序就会正常工作。

但是为什么呢?StringTokenizer和split(“”)做的不是一样吗?


共有2个答案

别俊誉
2023-03-14

要大写每个单词,可以使用WordUtils。Apache Lang中的大写(str)。

元音和辅音计数技术可以在SO的这个线程中找到。

邵宜年
2023-03-14

StringTokenizer的countTokens方法的API文档说明:

计算此标记器的nextToken方法在生成异常之前可以调用的次数。当前位置不高级。

你在for循环中调用它,就像你期望它保持不变一样,但是每次你前进一个令牌,它就会减少1。因此,如果你的字符串有4个令牌,你只能得到前两个。字符串数组中剩下空值。

您可以通过使用调试器或在html" target="_blank">代码中添加printlns来检查这种情况。

有几种解决方案。您可以修复代码以预先存储令牌计数,而不是继续调用该方法。更好的是,hasMoreTokens方法正好适用于这种情况,请使用它。或者您可以按照文档中的建议进行操作:

StringTokenizer是一个遗留类,出于兼容性原因保留了它,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人使用String或java的split方法。util。改为正则表达式包。

查看文档。当某件事情的表现与您认为的不一致时,仔细检查文档,看看您的假设是否真的有效。

 类似资料:
  • 问题内容: 我刚刚了解了Java的Scanner类,现在我想知道它如何与StringTokenizer和String.Split进行比较/竞争。我知道StringTokenizer和String.Split仅适用于字符串,那么为什么要对字符串使用扫描器?扫描仪是否仅打算一站式进行拆分? 问题答案: 他们本质上是课程的马。 设计用于需要解析字符串,提取不同类型数据的情况。它非常灵活,但是可以说它并没

  • 爪哇岛。所以我想输入一个整数数组,然后使用 StringTokenizer 打印出最大值。我知道如何使用整数来做到这一点,但是当我尝试使用数组时,字符串到 int 命令 (Integer.parseInt) 失败了 - 无法从 int 转换为 int[]。 我该如何解决这个问题,或者我应该使用其他命令吗?

  • 我最近在做一个简单的项目文件读,写和比较字符串在核心Java。我使用StringTokenizer解析行中的每个元素。但是在这样做的时候,我遇到了以下错误消息。任何关于这方面的帮助,提前感谢。错误消息: 我的代码就像跟随; 和文件示例为:

  • 我有以下输入字符串: 这里有各种各样的错误:标题前面有“。”应该是ID后面的分隔符。作者姓名的最后两个字符出现在日期字段中,实际日期丢失。 我怎样才能纠正这些问题?

  • 我必须使用网格在Android中实现照片浏览器。所以,我想知道GridView和GridLayout之间的区别。 所以我会选择正确的一个。 目前我正在使用GridView动态显示图像。

  • [1]“多线程和异步编程的区别”