切片

时间:2014-01-30 20:58:53

标签: java

我正在尝试第一次切割字符串。

使用此代码,如果我输入,例如'一二三',它可以正常工作,直到最后一个字。 这是输出的最后几行:

当前的词是thr

句子现在是

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
    at java.lang.String.substring(String.java:1907)
    at TestCurr.main(testCurrentWord.java:18)

有没有人知道为什么这样做到最后一个字?

class TestCurr
{
    public static void main (String []args)
    {
        String s;
        int i;
        String currentWord;
        int length;
        int spacePos;

        System.out.println("Enter a sentence ");
        s = EasyIn.getString();
        spacePos = s.indexOf(" ");
        length = s.length();

        for (i = length -1; i >= 0;  i--)
            {
                currentWord = s.substring(0,spacePos);
                s = s.substring(spacePos +1);

                System.out.println("Current word is " + currentWord);
                System.out.println("Sentence is now " + s);
            }
    }
}

5 个答案:

答案 0 :(得分:4)

首先,你打电话

spacePos = s.indexOf(" ");
length = s.length();

只有一次,但这些值应该随着循环的每次迭代而改变。此外,

s.substring(spacePos +1);

spacePos == s.length()-1

表示您将索引超出字符串末尾作为start的{​​{1}}索引。修复第一个错误后,这将是您的下一个例外。

答案 1 :(得分:2)

您的问题是您只获得一次空间索引。这导致程序每三个字符剪切一次字符串,因为第一个字是三个字母长。您需要在每次迭代后更新spacePos。

答案 2 :(得分:1)

我认为您的问题在于使用spacePos变量。

在循环外部,您可以像这样初始化变量:

spacePos = s.indexOf(" ");

在你的示例字符串“一二三”中,产生3。

但是在你的循环中,你永远不会再根据你没有处理过的东西再次设置变量。

尝试在循环内重新计算spacePos的值,您的问题就会消失。

答案 3 :(得分:1)

您当前的方法太容易出错。 你有太多的变数。

尝试这个只是一个想法。

class TestCurr {

    public static void main(String[] args) {
        String s = null;

        System.out.println("Enter a sentence: ");
        s = "   one   two   three   ";
        System.out.println("|" + s + "|");

        int i = 0;
        int j = 0;

        while (true){
            while (i<s.length() && s.charAt(i)==' ') i++;
            j = i;
            if (i>=s.length()) break;
            while (i<s.length() && s.charAt(i)!=' ') i++;
            System.out.println("Current word is: [" + s.substring(j, i)+ "]");
            System.out.println("Sentence is now: [" + s.substring(i) + "]");
            if (i>=s.length()) break;
        }

    }

}

答案 4 :(得分:0)

正如其他人所说,你只能获得一次索引。但我很好奇,为什么重新发明轮子?

String s = "one two three";
String[] split = s.split(" ");
for (String out : split) {
    System.out.println("Word: " + out);
}