2013-07-03 182 views
2

我創建了類Word。 Word有一個構造函數,它接受一個字符串參數和一個方法getSubstrings,它返回一個包含所有字的子串的字符串,按照長度排序。查找字符串的所有子字符串 - StringIndexOutOfBoundsException

例如,如果用戶提供了輸入「朗姆酒」,則該方法返回一個 串,將打印這樣的:

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(),您還有其他建議。
如何解決這個問題?異常的

+0

次,然後考慮使用String構造函數以及'substring()'方法,就像你的情況一樣,'str = new String(word.substring(i,i + j));'。否則,它可能會在某個時間導致內存泄漏(是的,但它與具體問題無關)。 – Lion

回答

6

分析:

Java7 Docs of StringIndexOutOfBoundsException

public class StringIndexOutOfBoundsException extends IndexOutOfBoundsException 

由String方法拋出,表明索引或者爲負,或者超出字符串的尺寸越大。

Java 7 Docs of substring

public String substring(int beginIndex,int endIndex) 

返回一個新字符串,它是此字符串的一個子。子字符串從指定的beginIndex開始,並擴展到索引endIndex - 1處的字符。因此,子字符串的長度是endIndex-beginIndex。

我想這:長度的字符串是endIndex的-的beginIndex進入String index out of range: -1。我已經測試了多個案例,並堅持我的假設,但非常感謝任何其他證明。

爲-1:"rum".substring(2,1);會給你的StringIndexOutOfBoundsExceptionString index out of range: -1

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

原因:

在給定的代碼片段,substring正在努力獲取具有比總長度endIndex多串的字符串(i+j將超過字符串的總長度):

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

考慮的情況下當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 
+0

這是失敗 - 任何輸出。 –

+2

這是因爲'str'會在'='的內部循環中被覆蓋。將其更改爲'+ =' –

+0

感謝@HunterMcMillen :) – ritesh

4

你的邏輯似乎令人費解,異常的來源:

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

考慮你ij都等於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

+0

您的建議失敗 –

+0

@nazar_art您能與我分享測試結果嗎? – NINCOMPOOP

+0

你不能改變'public String getSubstrings()'方法的簽名' –

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)) 
相關問題