2017-02-28 19 views
0

私はここでArrayIndexOutOfBoundsエラーが発生しましたが、どこにあるのか分かりません。コードでは、ユーザーがサイズを入力する配列を作成しています。配列は文字列であり、imputsはすべての単語です。次に、ユーザーは配列の単語を検索し、単語が何回あるかを確認するよう求められます。リニア検索の配列と文字列

誰でも手助けできますか?

import java.util.*; 
public class SearchArray { 
    public static void main (String[]args) { 
     Scanner scan = new Scanner(System.in); 
     int row = scan.nextInt(); 
     int col = scan.nextInt(); 
     String search = new String(); 
     String array[][] = new String[row][col]; 
     for(int i = 0; i < row; i++){ 
      for(int j = 0; j < col; j++){ 
       array[i][j] = scan.nextLine(); 
      } 
      System.out.println(countStrings(array,search)); 
     } 
    } 
    public static int countStrings(String[][]array, String search) { 
     int count = 0; 
     int row = array.length; 
     int col = array[0].length; 
     for(int i = 0; i < col; i++){ 
      for(int j = 0; j < row; j++){ 
       if(array[i][j] == search){ 
        count++; 
       } 
      } 
     } 
     return count; 
    } 
} 
+0

。 –

+0

文字列を '=='で比較するべきではありません。代わりに '.equal'を使用してください。 – Christian

+0

実際には配列にすべてを入力させることはありません –

答えて

2

まず第一には、scan.next()の代わりscan.nextLine()を使用しています。

array[i][j] = scan.next(); 

see this for difference

、文字列オブジェクトであり、彼らは常に同じです。したがって、==を使用して比較しないでください。 2つの文字列を比較するには、.equals()を使用します。基準等しいかどう

array[i][j].equals(search); 

==試験(それらが同じオブジェクトであるかどうか)。

.equals()(論理的に「等しい」かどうか)の値が等しいかどうかをテストします。

他の人のコメントと同じように、最後にネストされたforループで行と列を入れ替えました。

それは次のようになります。

for(int i = 0; i < row; i++){ 
     for(int j = 0; j < col; j++){ 
      if(array[i][j].equals(search)){ 
       count++; 
      } 
     } 
    } 

・ホープ、このことができます:)

EDIT:

あなたのループのネストされたの外にこの行を保管してください:

System.out.println(countStrings(array,search)); 

も使用を行を取得する場合はarray[0].length、長さを取得する場合はarray[1].length

だから、全体のコードは次のようになります。

import java.util.*; 
public class SearchArray { 
public static void main (String[] args) { 
    Scanner scan = new Scanner(System.in); 
    int row = scan.nextInt(); 
    int col = scan.nextInt(); 
    System.out.println("Scan the string to be searched!"); 
    String search = scan.next(); 
    String array[][] = new String[row][col]; 

    for(int i = 0; i < row; i++){ 
     for(int j = 0; j < col; j++){ 
      array[i][j] = scan.next(); 
     } 

    } 

    System.out.println(countStrings(array, search)); 

} 
public static int countStrings(String[][]array, String search) { 
    int count = 0; 
    int row = array[0].length; 
    int col = array[1].length; 
    for(int i = 0; i < row; i++){ 
     for(int j = 0; j < col; j++){ 
      if(array[i][j].equals(search)){ 
       count++; 
      } 
     } 
    } 
    return count; 
} 
} 
+0

Iveはこれらを変更しただけですが、今度は行と列に入力するたびに配列を完成させません。例えば。 2x2配列では、エラーが出る前に2単語しか入力できませんでした。 2番目の数字と同じくらい多くの単語を入力することしかできないようです。/ –

+0

どのエラーが発生していますか? – Kaushal28

+0

したがって、3行2列を入力すると、2ワードしか許されず、次に "java.lang.NullPointerException"が返されます。\t SearchArray.countStrings(SearchArray。Javaの:sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で33) SearchArray.mainで\t(SearchArray.java:18) \t sun.reflect.NativeMethodAccessorImpl.invokeで \t(不明なソース) \t日で。 reflect.DelegatingMethodAccessorImpl.invoke(不明なソース)java.lang.reflect.Method.invokeで \t(不明なソース)edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommandで \t(JavacCompiler.java:267) 「 –

0

私はあなたのフォローアップにコメントするのに十分な評判ポイントを持っていけない申し訳ありません。 scan.nextInt();が "\ n"を消費しないため、配列を埋めることができない理由が考えられます。

あなたはそうのような\ nを消費するようにコードを変更することで、改行文字を消費することができます:あなたは、最後のネストされたループ内の行とCOLを入れ替えました Scanner scan = new Scanner(System.in); int row = scan.nextInt(); int col = scan.nextInt(); scan.nextLine();

+0

それでも同じエラーが発生します。その本当にイライラする私は終日それを見てきた –

関連する問題