Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

配列のマージについて

こんにちは。

今2つの配列を整列させて、一つの新しい配列を作ろうと
しています。

しかし、途中でjava.lang.ArrayIndexOutOfBoundsException: 5
が起こってしまいます。しかし、まったく同じソースを、
http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/merge-sort.htmlのページから引っ張ったところ、なぜかエラーが起こりません。以下に2つのソースを起きます。何故僕のが上手くいかないか教えてください。

//自作
public int[] marge(int[] a, int[] b, int[] c){

    int i = 0;
    int j = 0;

    //aかbの配列が残っているとき
    while( i < a.length || j < b.length){
    //bが空か、aがbより小さいときにcにaを加える
    if(j > b.length || (i < a.length && a[i] < b[j])){
                
        c[i+j]=a[i];
        i++;

    //cにbを加える
    }else{
        c[i+j]=b[j];
        j++;
        }
    }
    return c;
}

//他サイトの
void merge(int[] a1,int[] a2,int[] a){
 int i=0,j=0;
   while(i<a1.length || j<a2.length){
    if(j>=a2.length || (i<a1.length && a1[i]<a2[j])){
      a[i+j]=a1[i];
      i++;
    }
    else{
       a[i+j]=a2[j];
      j++;
    }
   }
}

よろしくお願いします。






3

回答

5588

閲覧

3件の回答

評価

0

んー…。
ぱっと見て違いがあるようには思えないので、呼び出し側の問題ではないですか?
第三引数は、第一引数と第二引数それぞれのlengthを足した値の添え字で初期化されていなければならないように見えますが、されていますか?

評価

0

ありがとうございます。
そう思ったのですが、どちらも同じものを与えています。


int[] a = {3,5,7,8,10};
int[] b = {1,2,4,6,9};
int[] c = new int[10];

下のほうではエラーが出ません。
かなり迷宮です。

ちなみにエラーが出る箇所は、
 if(j > b.length || (i < a.length && a[i] < b[j])){
の位置で、jが5を超えてしまったときに、右側の
(i < a.length && a[i] < b[j])も判定してしまうために
配列異常エラーが出る模様です。

なぜ、他サイトさんのだと出ないのかが判りません。

評価

0

すみません。

今わかりました。

if(j > b.length || (i < a.length && a[i] < b[j])){
 if(j>=a2.length || (i<a1.length && a1[i]<a2[j])){

j>=a2 のように=が一個足りないという低レベルの問題でした。

申し訳ありません。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。