做一个统计字符串中单词的问题.我用的方法是调用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++)不过这样以多个空格结尾的字符仍然不能判断.)
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++)不过这样以多个空格结尾的字符仍然不能判断.)
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文档
难道这种方法不可行吗?
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
}
}
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');
}}
//输入一个字符串,字符串中的单词用空格分隔开,(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');
}}
“我的题目是求一串字符串中有几个单词”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、运行效率应该比逐个字符遍历要高一些
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++)不过这样以多个空格结尾的字符仍然不能判断.)