做一个统计字符串中单词的问题.我用的方法是调用String类中charAt方法,通过下面两个方法:1.for(i=0;i<str.lengh();i++){
      if(str.charAt(i)==' '&&str.charAt(i+1)!=' ') //判断空格数
       ............
       ............
}2.for(i=0;i<str.lengh();i++){
      if(str.charAt(i)!=' '&&str.charAt(i+1)==' ')
       ............
       ............
}我知道JAVA字符串中和没有像C那样末尾有'\0',通过调试发现当比较最后一个字符时,仍然会判断str.charAt(i+1),而它不存在,自然会出错
请问大家有什么方法改进?谢谢!
(当然也可以通过for(i=0;i<str.lengh()-1;i++)不过这样以多个空格结尾的字符仍然不能判断.)

解决方案 »

  1.   

    如果只是判断是不是有单词出现可以用STRING类的其它方法
      

  2.   

    1、如果是要统计一个字符串中某个片段(也就是某个单词)出现的次数,推荐使用Jarkarta Common项目中的common-lang中的StringUtils类。下载:
    http://commons.apache.org/lang/下载了common-lang-2.3.jar,加入程序classpath例:
    要统计字符串 “asdfhjsakldfsadfgjsdfsaldfasghfjsjafkldfsafdjkasdf”中"js"出现的次数,可以String s = "asdfhjsakldfsadfgjsdfsaldfasghfjsjafkldfsafdjkasdf";
    int numJs = StringUtils.countMatches(s, "js");
    System.out.println(numJs);输出结果:3StringUtils.countMatches(String , String)方法检测字符串片断出现频率。当然,如果楼主是为了学习算法什么的,还是自己写比较好2、似乎楼主的意思是要统计一句话里有多少个单词,那么可以使用String.split(regx),方法regx是正则表达式,该方法返回以满足这个正则表达式的字符串分割的字符串数组,获取这个数组的长度就ok了。注意,String.split()方法有几种重载的,最好自己察看java api文档
      

  3.   

    大家可能误会了我的意思。我的题目是求一串字符串中有几个单词。就按照我的方法的话,怎么样避免判断str.charAt(i+1)(因为它不存在)
    难道这种方法不可行吗?
      

  4.   

    lz是要判断字符串里的字符数量?有现成的api可以用public class Test { public void countSomething(String s){
    char[] c = s.toCharArray();
    int letterNum = 0,digitNum = 0,otherNum = 0;
    for(int i=0;i<c.length;i++){
    if(Character.isLetter(c[i])){
    letterNum++;
    }
    else if(Character.isDigit(c[i])){
    digitNum++;
    }
    else{
    otherNum++;
    }
    }
    System.out.println("letter:" + letterNum);
    System.out.println("digit:" + digitNum);
    System.out.println("other:" + otherNum);
    }

    public static void main(String[] args) {
    new Test().countSomething("fksj32k33_f  _"); // test
    }
    }
      

  5.   

    //输入一个字符串,字符串中的单词用空格分隔开,(1)判断该字符串是否为回文
    import java.util.*;
    import java.io.*;
    import java.util.Collections;
    public class MyString
    {
    public static void main(String[] args)throws IOException
    {
    BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
    char ch ='Y';
    do{
    System.out.println("请输入你的字符串,单词之间用空格:");
    String s = keyboard.readLine();
    String[] a = s.split(" "+"+"); //按正则表达式将字符串用给定的方式转换成数组
    String[] b = a.clone();
    b[0] = "wang";

    int flag = 1;
    for(int j=0;j<s.length();j++)
    if(s.charAt(j) != s.charAt(s.length()-j-1))
    {
    flag = 0;
    break;
    }
    if(flag == 1)
    System.out.println("你的字符串是回文");
    else
    System.out.println("你的字符串不是回文");
    //以上代码为判断字符串是否为回文


    for(int j=1;j<a.length;j++)
    for(int i=0;i<a.length-j;i++)
    if(a[i].compareToIgnoreCase(a[i+1])>0)
    {
        String temp=a[i];
    a[i]=a[i+1];
        a[i+1]=temp;
            }
    //以上为将单词排序

    System.out.println("你的字符串一共有"+a.length+"个单词");

     System.out.print("将你的字符串中的所有单词按字典顺序排列为:");
     for(int m=0;m<a.length;m++)  
         System.out.print(" "+a[m]);
     System.out.println();
     
     System.out.print("将你的字符串中的所有单词反序排列为:");
     for(int m=b.length-1;m>=0;m--)  
         System.out.print(" "+b[m]);
     
     System.out.println();
     
     System.out.println("是否继续(Y/N)");
     ch = keyboard.readLine().charAt(0);
        }while(ch=='y' || ch=='Y');
    }}
      

  6.   

    晕,刚刚那个有问题
    //输入一个字符串,字符串中的单词用空格分隔开,(1)判断该字符串是否为回文
    import java.util.*;
    import java.io.*;
    import java.util.Collections;
    public class MyString
    {
    public static void main(String[] args)throws IOException
    {
    BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
    char ch ='Y';
    do{
    System.out.println("请输入你的字符串,单词之间用空格:");
    String s = keyboard.readLine();
    String[] a = s.split(" "+"+"); //按正则表达式将字符串用给定的方式转换成数组
    String[] b = a.clone();
    // b[0] = "wang";

    int flag = 1;
    for(int j=0;j<s.length();j++)
    if(s.charAt(j) != s.charAt(s.length()-j-1))
    {
    flag = 0;
    break;
    }
    if(flag == 1)
    System.out.println("你的字符串是回文");
    else
    System.out.println("你的字符串不是回文");
    //以上代码为判断字符串是否为回文


    for(int j=1;j<a.length;j++)
    for(int i=0;i<a.length-j;i++)
    if(a[i].compareToIgnoreCase(a[i+1])>0)
    {
        String temp=a[i];
    a[i]=a[i+1];
        a[i+1]=temp;
            }
    //以上为将单词排序

    System.out.println("你的字符串一共有"+a.length+"个单词");

     System.out.print("将你的字符串中的所有单词按字典顺序排列为:");
     for(int m=0;m<a.length;m++)  
         System.out.print(" "+a[m]);
     System.out.println();
     
     System.out.print("将你的字符串中的所有单词反序排列为:");
     for(int m=b.length-1;m>=0;m--)  
         System.out.print(" "+b[m]);
     
     System.out.println();
     
     System.out.println("是否继续(Y/N)");
     ch = keyboard.readLine().charAt(0);
        }while(ch=='y' || ch=='Y');
    }}
      

  7.   


    “我的题目是求一串字符串中有几个单词”2、似乎楼主的意思是要统计一句话里有多少个单词,那么可以使用String.split(regx),方法 regx是正则表达式,该方法返回以满足这个正则表达式的字符串分割的字符串数组,获取这个数组的长度就ok了.建议方法:
       首先你定义哪些东西表示分割单词,比如空格,制表符,标点符号换句话说,可以认为就是任何非字母,数字的字符。那么任何非字母,数字的字符的正则表达式是:
       [^a-zA-Z0-9]+
       
    这个意思是,任何非字母,数字字符出现一次或多次,例子:
    String s = "sadfs,ad fm \ta.sd ?sadf ,di ljch l;d";
    System.out.println(s.split("[^a-zA-Z0-9]+").length);运行结果为:10
    表示上面一句话有10个单词:
    sadfs
    ad
    fm
    a
    sd
    sadf
    di
    ljch
    l
    d这个方法的好处是,
    1、代码少
    2、可以方便的定义单词之间是用什么分割的
    3、无需考虑“怎么样避免判断str.charAt(i+1)(因为它不存在)”问题
    4、运行效率应该比逐个字符遍历要高一些
      

  8.   

    1.for(i=0;i <str.lengh();i++){ 
          if(str.charAt(i)==' '&&str.charAt(i+1)!=' ') //判断空格数 
           ............ 
           ............ 
    } 2.for(i=0;i <str.lengh();i++){ 
          if(str.charAt(i)!=' '&&str.charAt(i+1)==' ') 
           ............ 
           ............ 
    } 我知道JAVA字符串中和没有像C那样末尾有'\0',通过调试发现当比较最后一个字符时,仍然会判断str.charAt(i+1),而它不存在,自然会出错 
    请问大家有什么方法改进?谢谢! 
    (当然也可以通过for(i=0;i <str.lengh()-1;i++)不过这样以多个空格结尾的字符仍然不能判断.)