53835


要素数5のソート済みの配列 {1,2,4,5,7},{8,9,11,13,17} を  
要素数10のソート済みの配列 {1,2,4,5,7,8,9,11,13,17} としたいため、  
以下のようなコードを考えました。

[code]

    public static void main(String[] args) {
    
        int[] a = { 1, 2, 4, 5, 7 };
        int[] b = { 8, 9, 11, 13, 17 };
        int[] s = new int[10];
    
        int i = 0; //配列aのi番目を指定
        int j = 0; //配列bのj番目を指定
        int k = 0; //配列sのk番目を指定
    
        while ((i < 5) || (j < 5)) {
            if (a[i] < b[j]) {
                s[k] = a[i];
                i++;
            } else {
                s[k] = b[j];
                j++;
            }
            k++;
        }
    
        while (i < 5) {
            s[k] = a[i];
            i++;
        }
    
        while (j < 5) {
            s[k] = b[j];
            j++;
        }
    
        System.out.println(Arrays.toString(s));
    
    }
    
[/code]

これを実行したところ、以下のエラーが発生しました。  
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5  
at mergeSort.MergeSort.main(MergeSort.java:17)

java.lang.ArrayIndexOutOfBoundsExceptionは  
配列のインデックスに存在しない要素を指定した時のエラーだと理解していますが、  
iもjも配列の要素数である5以内に収まっているように思います。  
なぜこのエラーが出るのでしょうか。

ご教授いただければ幸いです。


CC BY-SA 4.0
2019-03-31T04:17:18.463
53834
2019-03-31T04:30:21.310
question
java array
2つのソートされた配列を1つにまとめたい

[code]

        while ((i < 5) || (j < 5)) {
    
[/code]

だと、iとjのどちらかが５より小さい（４以下）であれば、もう一方が５以上となってもwhileループが実行されます。

[code]

        while ((i < 5) && (j < 5)) {
    
[/code]

とすれば、iとJの両方が５以上になることがないので質問のエラーが発生しなくなります。


CC BY-SA 4.0
2019-03-31T04:30:21.310
53835
2019-03-31T04:30:21.310
217
53834
answer