2016-04-27 20 views
1

このコードを使用してArrayListを検索しています。私はstr.length()を使って検索フィールド値の長さを読みました。問題は、if(movieArrayList.get(i)部分に「インデックスが範囲外です」例外がスローされることです。入力した検索がArrayListにある最短のタイトルよりも長いため、.substring(0,stringSize)と関係があることがわかります。この問題を解決する方法がわかりません。文字列長の問題

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

* * "私はこの問題を修正するかどうかはわからない" どのように文字列をカットし、 'startsWith'を使用していないでしょうか? – Tom

+0

はサイズが1でなければなりません – localplutonium

答えて

1

問題は、この行である:

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

iのタイトルはSearchField.getText()

から来ても、それはこのラインから来る可能性が少ないことstringSize、可能性があるため:

str.substring(0, 2) 

と同じ理由、SearchField.getText().length2より小さくなる可能性があります。

startWithメソッドで提案されたTomとして解決できます。

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

startsWithはキーセンシティブであるため、文字列をtoLowerCaseする必要があります。

+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))