递归单词搜索以查找单词的各种版本

时间:2013-10-12 11:37:55

标签: java string

我希望迭代一个单词并打印出它的所有不同变体。我已经编写了代码,但由于某种原因,我继续获得StringIndexOutOfBoundsException

public class Test {
public static void main(String[] args) {

    String word = "telecommunications"; // loop thru this word

    for (int i = 0; i < word.length(); i++) {
        for (int j = 0; j < word.length(); j++) {
            System.out.println(word.substring(i, j + 1)); 
                        //This will print out all the different variations of the word 

        }
    }
}

}

有人可以告诉我为什么会收到此错误吗?

4 个答案:

答案 0 :(得分:1)

请记住,Java(以及大多数语言)中的数组从零开始
这意味着,如果您有一个长度为N的字符串,则索引将从0N - 1 - 其总和将为N

看看这一行:

System.out.println(word.substring(i, j + 1)); 

字符串的长度为18,索引为0到17。

ji在这些索引上运行,但是在上一次迭代中执行j + 1会发生什么?
- 你会得到17 + 1,即18,超出范围

 j  | char at j
----+-------------
 0  |     t
 1  |     e
... |    ...
... |    ...
17  |     s
18  |    :(

我不会告诉你解决方案,但是当你知道为什么会发生这种情况时,它会直截了当。

答案 1 :(得分:0)

我想你想做这样的事情

for (int i = 0; i < word.length(); i++) {
    for (int j = i; j <= word.length(); j++) { // Change here
        System.out.println(word.substring(i, j));  // Change here
                    //This will print out all the different variations of the word
    }
}

您得到异常,因为当您尝试使用最后一个索引访问j+1时,索引超出范围,因为任何数组或arraylist或字符串中的最大可访问索引始终为n-1其中n是长度。

答案 2 :(得分:0)

异常的原因是word.substring(i, j + 1)。 假设,您正在迭代并拥有i=1&amp; j=17,在这种情况下,您尝试从位置1开始提取子字符串,直到i+j+1 = 19th位置,而字符串只保存18个字符或位置。

答案 3 :(得分:0)

因为word.substring(i,j + 1) 这里j值应该大于i值。因为前两次迭代它会正常工作。当第三次迭代时i = 2 j = 0当时word.substring(2,0 + 1)在这种情况下字符串索引超出范围:-1会因为我们不能回字而来子。第二个参数应该大于第一个参数