统计字符串中单词问题时碰到的疑惑!关于JAVA字符串的问题

Julykey 2008-04-05 03:01:43
做一个统计字符串中单词的问题.我用的方法是调用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++)不过这样以多个空格结尾的字符仍然不能判断.)
...全文
306 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenhongxin 2008-04-06
  • 打赏
  • 举报
回复
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++)不过这样以多个空格结尾的字符仍然不能判断.)
Julykey 2008-04-06
  • 打赏
  • 举报
回复
恩,和回文没什么关系,不过大家的答案让我很有收获。7楼的方法比较不错
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wang8118 的回复:]
晕,刚刚那个有问题

Java code//输入一个字符串,字符串中的单词用空格分隔开,(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{

[/Quote]

楼主的问题和“回文”有什么关系。。。。
  • 打赏
  • 举报
回复

“我的题目是求一串字符串中有几个单词”

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、运行效率应该比逐个字符遍历要高一些
梅小西Echo 2008-04-06
  • 打赏
  • 举报
回复
晕,刚刚那个有问题
//输入一个字符串,字符串中的单词用空格分隔开,(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');
}

}
梅小西Echo 2008-04-06
  • 打赏
  • 举报
回复
//输入一个字符串,字符串中的单词用空格分隔开,(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');
}

}

bootupnow 2008-04-06
  • 打赏
  • 举报
回复
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
}
}
Julykey 2008-04-06
  • 打赏
  • 举报
回复
大家可能误会了我的意思。我的题目是求一串字符串中有几个单词。就按照我的方法的话,怎么样避免判断str.charAt(i+1)(因为它不存在)
难道这种方法不可行吗?
  • 打赏
  • 举报
回复
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);

输出结果:3

StringUtils.countMatches(String , String)方法检测字符串片断出现频率。

当然,如果楼主是为了学习算法什么的,还是自己写比较好

2、似乎楼主的意思是要统计一句话里有多少个单词,那么可以使用String.split(regx),方法

regx是正则表达式,该方法返回以满足这个正则表达式的字符串分割的字符串数组,获取这个数组的长度就ok了。

注意,String.split()方法有几种重载的,最好自己察看java api文档

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧