将三个阵列合二为一

时间:2013-12-24 09:44:03

标签: java merge

这是我的程序,但它不会运行,我不知道如何解决它...它会引发异常!

它应该组合三个数组并对长度为12的新数组进行排序并将其打印出来。如果你没有马上修好它,我会很感激,因为这是作业。但我知道一切,我似乎无法弄清楚这一点!我对异常很不好......这是错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at Combine.Combine(Combine.java:25)
    at Combine.main(Combine.java:12)

这是程序:

public class Combine {

        public static void main(String[] args){

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

            Combine( a, b, c);

        }

        public static int[] Combine(int[] a, int[] b, int[] c)
        {


            int[] answer = new int[12];
            int i = 0, j = 0, k = 0, p = 0;

            while (i < 5 && j < 5)
            {
                if (a[i] < b[j])       
                    answer[k++] = a[i++];

                else        
                    answer[k++] = b[j++];               
            }

            while (i < 5 && p < 5 )
            {
                if (a[i] < c[p])
                    answer[k++]= a[i++];
                else
                    answer[k++]= c[p];
            }

            while (j < 5 && p < 5 )
            {
                if (b[j] < c[p])
                    answer[k++]= b[j++];
                else
                    answer[k++]= c[p++];
            }


            while (i < 5)  
                answer[k++] = a[i++];

            while (j < 5)    
                answer[k++] = b[j++];

            while (p < 5)    
                answer[k++] = c[p++];

            return answer;
        }

        }

5 个答案:

答案 0 :(得分:2)

我认为你应该在使用5的任何地方使用4。

在Java中,4个元素的数组 arr arr.length = 4 , 通常你像这样循环它

for (int i=0; i<4; i++){
    // do something
}

所以尝试将5改为4。 通过使用5,你将超出数组的范围。

更好的是,使用这种循环:

for (int i=0; i<arr.length; i++){
    // do something
}

后者是一种更好的做法,
比硬编码4的长度 同样的说法适用于while循环。

答案 1 :(得分:1)

更改此

while (i < 5 && j < 5) //and while (i < 5 && p < 5 ) and while (j < 5 && p < 5 )

和这个

while (i < 5) // and j and p.

到 - &gt;

while (i < 4 && j < 4) //and while (i < 4 && p < 4 ) and while (j < 4 && p < 4 )

while (i < 4) // and j and p.

索引从0到3,而不是1到4,这就是你获得该异常的原因。

答案 2 :(得分:1)

所有数组的长度均为4,表示从0到3的有效索引。但是在该代码中,您可以访问索引4:

    while (i < 5 && j < 5)
    {
        if (a[i] < b[j])       
            answer[k++] = a[i++];
        else        
            answer[k++] = b[j++];               
    }

这是因为你的while条件检查索引是否低于5.检查a.length和b.length以下更安全。

同时,依靠API的现有方法甚至更安全:

  • System.arraycopy()/ Arrays.sort()
  • List.addAll()/ Arrays.asList()/ List.toArray()

答案 3 :(得分:0)

使用<4而不是<5

或者您可以像这样使用

for (int val: arr)
{
  //do something            
}

答案 4 :(得分:0)

基本上你的数组有4个元素,所以它的长度为0-3,在if条件下你将它检查为0-4。因此它给出错误。
如果将它替换为4而不是5,则代码将正常运行。

public class Combine {

public static void main(String[] args) {

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

    Combine(a, b, c);

}

public static int[] Combine(int[] a, int[] b, int[] c) {

    int[] answer = new int[12];
    int i = 0, j = 0, k = 0, p = 0;

    while (i < 4 && j < 4) {
        System.out.println("@"+i);
        if (a[i] < b[j])
            answer[k++] = a[i++];

        else
            answer[k++] = b[j++];
    }

    while (i < 4 && p < 4) {
        if (a[i] < c[p])
            answer[k++] = a[i++];
        else
            answer[k++] = c[p];
    }

    while (j < 4 && p < 4) {
        if (b[j] < c[p])
            answer[k++] = b[j++];
        else
            answer[k++] = c[p++];
    }

    while (i < 4)
        answer[k++] = a[i++];

    while (j < 4)
        answer[k++] = b[j++];

    while (p < 4)
        answer[k++] = c[p++];

    return answer;
}

}