2

我创建了 Word 类。Word 有一个构造函数,它接受一个字符串参数和一个方法 getSubstrings,它返回一个包含单词所有子字符串的字符串,按长度排序。

例如,如果用户提供输入“rum”,该方法将返回一个字符串,该字符串将打印如下:

r
u
m
ru
um
rum 

我想连接字符串中的子字符串,用换行符(“\ n”)分隔它们。然后返回字符串。

代码:

    public class Word {
    String word;

    public Word(String word) {
        this.word = word;
    }
    /**
     * Gets all the substrings of this Word.
     * @return all substrings of this Word separated by newline
     */

    public String getSubstrings()
    {
        String str = "";
        int i, j;
        for (i = 0; i < word.length(); i++) {
            for (j = 0; j < word.length(); j++) {
                str = word.substring(i, i + j);
                str += "\n";
            }
        }
        return str;
    }

但它抛出异常:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1911)

我卡在了这一点上。也许,您根据此方法签名有其他建议public String getSubstrings()
如何解决这个问题?

4

3 回答 3

6

异常分析:

来自StringIndexOutOfBoundsException 的 Java7 文档

public class StringIndexOutOfBoundsException extends IndexOutOfBoundsException

由 String 方法抛出以指示索引为负数或大于字符串的大小

来自子字符串的 Java 7 Docs

public String substring(int beginIndex,int endIndex)

返回一个新字符串,它是该字符串的子字符串。子字符串从指定的 beginIndex 开始并延伸到索引 endIndex - 1 处的字符。因此子字符串的长度是 endIndex-beginIndex。

我猜这个: 子字符串的长度是 endIndex-beginIndex进入String index out of range: -1. 我已经测试了多个案例,证明我的假设是正确的,但感谢任何其他证据。

For -1: "rum".substring(2,1);会给你String index out of range: -1

Parameters:
    beginIndex - the beginning index, inclusive.
    endIndex - the ending index, exclusive.

StringIndexOutOfBoundsException 的原因

在给定的代码片段中,substring试图获取endIndex超过字符串总长度的字符串(i+j将超过字符串的总长度):

str = word.substring(i, i + j);

考虑单词“rum”的 i=2 和 j=2 的情况

那么str=word.substring(2, 4); 就不可能了

类似于问题中给出的代码片段的解决方案:

这应该可以解决问题:

 public String getSubstrings()
    {
        String str="",substr = "";
        for (int i = 0; i < word.length(); i++) {
            for (int j = 0; i+j <= word.length(); j++) { //added i+j and equal to comparison
               substr = word.substring(j, i + j); //changed word.substring(i, i + j) to word.substring(j, i + j)
               if("".equals(substr))continue; //removing empty substrings
               str += substr; //added concatenation + operation
               str += "\n";
            }
        }
        return str+word;
    }

测试用例:

对于word="rum",这将给出输出:

r
u
m
ru
um
rum
于 2013-07-03T16:38:20.987 回答
4

您的逻辑似乎很复杂,异常的来源:

str = word.substring(i, i + j);

考虑你的iand jboth equals word.length()-1,那么substring()将会失败。

你可以简单地做:

public String getSubstrings(String word){
   StringBuilder sub= new StringBuilder();
   for( int i = 0 ; i < word.length() ; i++ )
   {
      for( int j = 1 ; j <= word.length() - i ; j++ )
      {
         sub .append(word.substring(i, i+j)).append("\n");
      }
   }
   return sub.toString();
}

注意:StringBuilder如果String您将在String.

于 2013-07-03T16:41:41.913 回答
1

我意识到我参加这个聚会有点晚了,我自己也是一个非常新的程序员——但我昨晚在尝试编写类似的方法时遇到了同样的错误。

对我来说,它有助于将嵌套for循环的计数器变量重命名为描述它们正在跟踪的内容的名称。对于外循环,我使用int subLength了 ,对于内循环,我使用了int position(起始位置)。我确信还有其他方法可以做到这一点,但我对我的解决方案很满意。这是一些伪代码,我希望可以帮助其他查找此问题的人:

     for each possible substring length 1 up to and including the original word length: 
            generate substrings starting at the 0th position, and then starting at each 
            proceeding letter up to but not including (word.length() - (subLength - 1))
于 2015-07-17T18:58:42.710 回答