2016-03-22 20 views
0

プログラムを実行した後、それはIf (key.compareTo(a[mid]) == 0)に私を誘導しました何が問題なのですか? SearchesDemo.main(SearchesDemo.java:23)スレッド "main"の例外java.lang.ArrayIndexOutOfBoundsException:5

import java.util.Scanner; 
import java.util.Arrays; 

public class SearchesDemo{ 

    public static void main(String[] args){ 
    BinarySearch searches = new BinarySearch(); 
    int result, key; 
    Integer [] integerArray = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}; 
    String [] stringArray = {"apples", "oranges", "peaches", "strawberries", "watermelons"}; 

    System.out.println("Integer test array contains:"); 
    System.out.println(Arrays.toString(integerArray)); 

    for(key = -3; key == 4; key++){ 
     result = searches.<Integer>search(integerArray, 0, 10, key); 
     searches.toString(Integer.toString(key), result); 
    } 

    System.out.println("\nString test array contains:"); 
    System.out.println(Arrays.toString(stringArray)); //toString may not be necessary 

    result = searches.<String>search(stringArray, 0, 10, "apples"); 
    searches.toString("apples", result); 
    result = searches.<String>search(stringArray, 0, 10, "plums"); 
    searches.toString("plums", result); 

    System.out.println("\nProcess completed."); 
    } 
} 

public class BinarySearch{ 


    public static <T extends Comparable> int search(T [] a, int first, int last, T key){ 
    int result = 0; //to keep the compiler happy. 

    if (first > last) 
     result = -1; 
    else{ 
     int mid = (first + last)/2; 

     if (key.compareTo(a[mid]) == 0) 
     result = mid; 
     else if (key.compareTo(a[mid]) < 0) 
     result = search(a, first, mid - 1, key); 
     else if (key.compareTo(a[mid]) > 0) 
     result = search(a, mid + 1, last, key); 
     else{ 
     System.out.println("Error"); 
     result = -1; 
     } 
    } 
    return result; 
    } 

    public static void toString(String key, int result){ 
    if(result == -1) 
     System.out.println(key + " is not in the array."); 
    else 
     System.out.println(key + " is at index " + result); 
    } 
} 
でBinarySearch.search(BinarySearch.java:17)で5 :スレッド "メイン" java.lang.ArrayIndexOutOfBoundsExceptionで

例外

+0

0と10の中間点を評価すると5になりますが、配列の5番目の要素にアクセスするには0インデックスから開始するので[4]が必要です。それは5列の文字列(0-4)です。 – ManoDestra

答えて

1

lastの値には10を送信しないでください。配列の長さだけを送信してください。

result = searches.<String>search(stringArray, 0, stringArray.length, "apples"); 
searches.toString("apples", result); 
result = searches.<String>search(stringArray, 0, stringArray.length, "plums"); 
searches.toString("plums", result); 

同じここで:

result = searches.<Integer>search(integerArray, 0, integerArray.length, key); 
1

問題はあなたのStringArrayに5つの要素を持っていることである(インデックス0、1、2、3、4)、そして、あなたは初めのインデックスでで始まるので、 0で最後に10である場合、メディアは5であるため、そこにないインデックスにアクセスしようとします。

+0

申し訳ありませんが、この行の "SearchesDemo.main(SearchesDemo.java:23)"が表示されます: "result = searches。 search(stringArray、0、10、" apples ");" –

+0

@FallAndLearn - nope。コードと例外をもう一度見てください。それは行番号を述べています。問題の作成者は残念ながら、2つのファイルの内容を同じコードブロックに配置しました。例外は、クラス23への 'SearchesDemo'を指します(' result = searches。 search(stringArray、0、10、 "apples"); ')。 – tommus

+0

申し訳ありませんが、私のせいです。私は他の方法を丸ごと見た:) – FallAndLearn

1

メインメソッドで行番号に例外が発生します。あなたは0として開始と終了インデックスを渡しているだけ5.半ばを計算すると、それは5 arr[5]あるarrayIndexOutOfBound例外をスロー(0+10)/2なっ10.

result = searches.<String>search(stringArray, 0, 10, "apples"); 

あなたstringarrayは、長さを有しています。

関連する問題