2014-01-31 74 views
0

此方法應該獲取特定模式的出現次數並返回int值。我不斷收到這個錯誤我無法獲取子串的工作

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 

代碼

public int getCount(String pattern){ 
    int occerenceOfPattern = 0; 
    for (int i = 0; i <= strand.length(); i++) { 
     if (strand.substring(i, i + pattern.length()) == pattern) { 
      occerenceOfPattern++; 
     } 
    } 
    return occerenceOfPattern; 
} 
+0

什麼是鏈? – Rahul

+0

什麼是「鏈」? –

+0

strand是一個封裝的字符串,我正在尋找模式的出現。 – user3212766

回答

0

您需要更正環路你的病情檢查,並添加循環塊內新的檢查:

public int getCount(String pattern){ 
    int occerenceOfPattern = 0; 
    for (int i = 0; i < strand.length(); i++) { // Updated check 
     if((i + pattern.length()) >= strand.length()) // New condition to avoid exception 
      break; 
     if (strand.substring(i, i + pattern.length()) == pattern) { 
      occerenceOfPattern++; 
     } 
    } 
    return occerenceOfPattern; 
} 

新增加的檢查也在循環條件下處理。

+0

作品,謝謝!我只需要改變第一個if語句:「if((i + pattern.length())> = strand.length())」大於,因爲如果模式等於該鏈,occerenceOfPattern仍然等於1。 – user3212766

+0

你是對的,條件'我 spgodara

0
i <= strand.length() in your for loop is your problem... 

長度()返回在數組元素的數目。請記住,索引從0開始。因此,如果長度爲5,則有5個元素0,1,2,3和4.因此,您必須使用i<strand.length();

您得到StringIndexOutOfBoundsException,因爲索引爲「length- 1「是最後一個元素,您試圖訪問索引=」length「的元素。

0

3個問題...

變化< =到<在循環。

您還需要限制子字符串的右側不超過字符串的末尾。

而且您需要使用.equals()而不是==。

public int getCount(String pattern){ 
    int occerenceOfPattern = 0; 
    for (int i = 0; i < strand.length(); i++) { 
     if (strand.substring(i, Math.min(i + pattern.length(), strand.length())).equals(pattern)) { 
      occerenceOfPattern++; 
     } 
    } 
    return occerenceOfPattern; 
} 
1

StringIndexOutOfBoundsException來的時候,你都指向是null指數(不存在)。這裏我看到的問題是strand.length()

for (int i = 0; i < strand.length(); i++)

這應該做工精細

1

你遍歷太遠您String

對於substringcharAt,或需要對您使用的確切數值以獲得在一個字符或一組字符的任何方法,所述String的大小被定義爲length()呼叫減去1的結果。

這就像一個數組(因爲它是由char[]支持):"cat"長度爲3,但它是從零開始的,所以我只能上去2

更改你的條件是嚴格低於,並且不小於或等於。

1
public int getCount(String pattern){ 
    int occerenceOfPattern = 0; 
    for (int i = 0; i < strand.length(); i++) { 
     if (strand.substring(i, i + pattern.length()) .equals(pattern)) { 
      occerenceOfPattern++; 
     } 
    } 
    return occerenceOfPattern; 
} 

(改變==.equals。原因見this post)使用equalIgnoreCase如果它是不區分大小寫。

長度()已經在其餘的答案中描述了

==測試引用相等。

.equals()測試值相等。

How to compare Strings in java

2
i <= strand.length() 

。length()返回字符串的總長度,並且字符串的索引從0開始。因此,如果我等於字符串長度,則會出現越界。要解決這一點:

i <= strand.length() - 1 

i < strand.length()