嗨,伙计们和ty阅读我的问题。我想写一个程序,它必须读取一个字符串并拆分它的单词并再次以随机顺序连接它们。我写到目前为止:
package read.java;
import java.io.*;
public class ReadJava {
public static int count;
public static String[] stringsplit(String S)
{
count=0;
String[] strings=new String[10];
if (S.isEmpty())
return strings;
char start=0;
while(true)
{
if(S.charAt(start)!=' ')
{
strings[count]+=S.charAt(start);
}
else
{
if(S.charAt(start)==' '&&S.charAt(start-1)!=' ')
{
count++;
}
if(start==S.length())
{
count++;
break;
}
}
start++;
}
return strings;
}
public static String stringjoin(String[] words)
{
int [] wordnum= new int [count];
for(int i=0;i<count;i++)
{
wordnum[i]=i;
}
String newS = new String();
while (count!=0)
{
int randnum;
randnum = (int)Math.random()%count;
newS+=words[randnum];
for(int i=randnum;i<count-2;i++)
{
wordnum[i]=wordnum[i+1];
}
count--;
}
return newS;
}
public static void main(String[] args) throws IOException {
BufferedReader bfreader =new BufferedReader(new InputStreamReader(System.in));
String S = new String();
S=bfreader.readLine();
String[] strings=new String[10];
strings=stringsplit(S);
S=stringjoin(strings);
System.out.println(S);
}
}
但是当我编译并输入任何句子时,它会引发异常:
StringIndexOutOfBoundsException
在这一行:
S.charAt(start)!=' '
我是Java的新手,我对错误没有任何想法。
该错误由您的帮助修复,但仍然是错误的。我在stringsplit中解决了这个问题:
while(start < S.length())
但它打印“nullThisnullisnullanulltest”为“这是一个测试” 我的stringjoin方法错了吗?!
答案 0 :(得分:2)
您应该更改while
条件:
while (start < S.length())
因为你可以达到的字符串的最大索引是(字符串的长度-1,从零开始的索引)
P.S。您可以从拆分功能中删除以下内容,它将永远无法访问:
if(start==S.length())
{
count++;
break;
}
P.P.S。您在输出处获得“null”,因为您使用“null”值初始化数组。要解决此问题,请在数组init Arrays.fill(strings,"")
之后添加以下内容。因此,stringsplit
函数开头的正确代码将是这样的:
count=0;
String[] strings=new String[S.length()]; //we don't know the number of words we get, but this number definitely no more that length of incoming string
Arrays.fill(strings, "");
if (S.isEmpty()){
....
答案 1 :(得分:1)
越界异常是因为您试图访问其范围之外的字符串索引(因为String本质上是一个字符数组)。
另一方面,我可以推荐:
String orig = "Some string with spaces";
String[] split = orig.split(" ");
答案 2 :(得分:0)
start
最终等于字符串的长度,但你必须记住,字符串的长度比结束元素大1(因为String
是零基于数组)。
使while循环中的条件沿着while(start < S.length)