2017-10-16 10 views
-2

私はJavaを使い慣れておらず、合計に等しいペアのインデックスの合計を返すアルゴリズムを作成しようとしています。再帰関数を呼び出すときにIndexOutOfBoundsExceptionが発生する

境界について再帰関数をヒットしたときにエラーが発生しました。境界は私にはうまく見える、私はちょうど更新されたarraylistを渡しているので、どこから来るのかわからない。

エラー

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 
    at java.util.ArrayList.rangeCheck(ArrayList.java:653) 
    at java.util.ArrayList.get(ArrayList.java:429) 
    at com.example.helloworld.HelloWorld.getMatches(HelloWorld.java:36) 
    at com.example.helloworld.HelloWorld.getMatches(HelloWorld.java:41) 

アルゴリズム

public class HelloWorld { 

ArrayList<Integer> matches = new ArrayList<>(); 
ArrayList<Integer> temp = new ArrayList<>(); 

public static void main(String[] args) { 
    ArrayList<Integer> param = new ArrayList<>(Arrays.asList(0, 0, 0, 0, 1, 1)); 

    int res = new HelloWorld().pairwise(param, 1); 
    System.out.println(res); 
} 

private int pairwise(ArrayList<Integer> arr, Integer total) { 
    for (Integer item: arr) { 
     this.temp.add(item); 
    } 
    getMatches(this.temp, total); 
    return getIndices(this.matches, arr); 
} 

private void getMatches(ArrayList<Integer> arr, Integer total) { 
    boolean noMatch = true; 

    for (int i=1; i<arr.size(); i++) { 
     if (arr.get(0) + arr.get(i) == total) { 
      //add to matches 
      this.matches.add(arr.get(0)); 
      this.matches.add(arr.get(i)); 

      //remove from temp 
      this.temp.remove(0); 
      this.temp.remove(arr.get(i)); 

      noMatch = false; 
      if (this.temp.size() > 1) { 
       //ERROR HERE 
       getMatches(this.temp, total); 
      } 

     } 
    } 
    if (noMatch) { 
     this.temp.remove(0); //remove first one 
     if (this.temp.size() > 1) { 
      getMatches(this.temp, total); 
     } 
    } 
} 

private int getIndices(ArrayList<Integer> matches, ArrayList<Integer> array) { 
    int count = 0; 
    for (Integer item: matches) { 
     int index = array.indexOf(item); 
     count += index; 
     array.set(index, -3000); 
    } 
    return count; 
} 
} 

すべてのヘルプははるかに高く評価されます。

答えて

0

追加-1に条件

private void getMatches(ArrayList<Integer> arr, Integer total) { 
boolean noMatch = true; 

for (int i=1; i<arr.size()-1; i++) { 
    if (arr.get(0) + arr.get(i) == total) { 
     //add to matches 
     this.matches.add(arr.get(0)); 
     this.matches.add(arr.get(i)); 

     //remove from temp 
     this.temp.remove(0); 
     this.temp.remove(arr.get(i)); 

     noMatch = false; 
     if (this.temp.size() > 1) { 
      //ERROR HERE 
      getMatches(this.temp, total); 
     } 

    } 
} 
if (noMatch) { 
    this.temp.remove(0); //remove first one 
    if (this.temp.size() > 1) { 
     getMatches(this.temp, total); 
    } 
} 

}

3

URM ...あなたが繰り返し処理しているあなたがここに

...配列から要素を削除しているために:

for (int i=1; i<arr.size(); i++) { 
    //...code 
} 

配列の最初のサイズは6です。次にが内側ですループ本体のためのあなたはあなたを介してループしている配列から要素を削除だ:

//remove from temp 
this.temp.remove(0); 
this.temp.remove(arr.get(i)); 

をすべての反復はあなたがバインドされた例外のうち取得している理由である配列が短くなります。

あなたはtempから要素を削除するだろうあなたがgetMatchesすなわち

getMatches(new ArrayList<>(this.temp), total); 

この方法に渡す配列を複製することをお勧めしますが、あなたは実際に反復処理している配列に影響を与えることはありません。arr

+0

ザッツそれ!私はこれまでにもこれを認識し、別のアプローチで 'list iterators'を見ていました。ありがとう、休憩の時間... – andrewgi

1

あなたはその後、削除iにある要素を削除する必要があり0

 //remove from temp 
     this.temp.remove(arr.get(i)); 
     this.temp.remove(0); 
関連する問題