2016-04-27 219 views
1

我正在使用這段代碼來搜索ArrayList。我使用str.length()來讀取搜索字段值的長度。問題在於它會在if(movieArrayList.get(i)部分拋出「索引超出範圍」異常。我知道它與.substring(0,stringSize)有關,因爲我輸入的搜索時間比ArrayList中的最短標題長。我不知道如何解決這個問題。字符串長度問題

class SearchListener implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     Object[] movieList = movieArrayList.toArray(); 
     String searchValue = SearchCombo.getSelectedItem().toString(); 
     // System.out.println(searchValue); 
     if (TelevisionBox.isSelected()) { 
      switch (searchValue) { 
       case "Title" : { 
        // System.out.println(searchValue); 
        String str = SearchField.getText(); 
        int stringSize = str.length(); 
        for (int i = 0; i < movieArrayList.size(); i++) { 
         // System.out.println(searchValue); 
         if (movieArrayList.get(i).getTitle().substring(0, stringSize).equalsIgnoreCase(str) 
           && str.substring(0, 2).equals("Te")) { 
          System.out.println(str); 
          ResultArea.append(str.toString() + "\n"); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+3

* 「我不知道如何解決此問題」 *如何不切割String和使用'startsWith'? – Tom

+0

應該是大小 - 1 – localplutonium

回答

1

的問題是在這條線:

movieArrayList.get(i).getTitle().substring(0, stringSize) 

因爲標題i可能小於stringSize,它來源於SearchField.getText()

,也可能來自於這條線:

str.substring(0, 2) 

與之前一樣的原因,SearchField.getText().length可能小於2

你可以用Tom建議的startWith方法解決它。

movieArrayList.get(i).getTitle().toLowerCase().startsWith(str.toLowerCase()) && 
str.toLowerCase().startsWith("te") 

請注意,您必須對字符串進行LowCase處理,因爲startsWith對鍵敏感。

+0

謝謝你們完美的工作 – ForswornDragon

+0

@ForswornDragon np,請不要忘記接受答案。 – raven

+0

現在好了,那已經整理出來了,我在搜索欄顯示結果時遇到了困難。我刪除了System.out.println(str);因爲這是爲了調試目的。我不知道插入ResultArea.append的內容,我知道如果我把movieArrayList放在ArrayList中的所有內容。如果我需要問這是另一個問題,請告訴我。 – ForswornDragon

2

而是讓你不確定的字符串長度的字符串,你可以使用:

  • String.contains()

    //Check if your input string exist in any of your movie names 
    
  • String.matches()

    //Check if your input string matches any of your movie names 
    
  • String.startsWith()

    //Check if any of your movie names begins with the input string 
    

例子:

if (movieArrayList.get(i).getTitle().toLowerCase().contains(str)) 
if (movieArrayList.get(i).getTitle().toLowerCase().matches(str+".*")) 
if (movieArrayList.get(i).getTitle().toLowerCase().startsWith(str))