尝试将两个不同长度的数组相加时出错

时间:2014-10-26 04:14:16

标签: java arrays

我试图做到这一点,所以每个数组的元素都加在一起得到一个总和,无论一个数组是否大于另一个数组。这是我得到的错误

  

线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:5

错误链接到第13行或第23行,具体取决于我的测试类中哪个数组更大。 (pickedList[i] = listA[i] + listB[i];是错误行)

编辑:如果数组具有相同数量的元素,则代码可以正常工作,但当一个数组更大时会崩溃。

    public static int[] AddArray(int[] listA, int[] listB)

    { 
    int aLen = listA.length;
    int bLen = listB.length;
    int[] pickedList = null;
    //if array 1 is longer, make picklist have same number of elements then add
    //both array elements together
    if (aLen >= bLen)
    { pickedList = new int[aLen];
          for( int i = 0; i < aLen; i ++)
          {
            pickedList[i] =  listA[i] + listB[i]; 
          }
    }
     //if array 2 is longer, make picklist have same number of elements then add
    //both array elements together
    else 
    {
           pickedList = new int[bLen];
        for( int i = 0; i < bLen; i ++)
          {
            pickedList[i] =  listA[i] + listB[i] ;
          }   
    }
        return pickedList;
    }
}

6 个答案:

答案 0 :(得分:1)

您的错误非常简单:

if (aLen >= bLen)
    { pickedList = new int[aLen];
          for( int i = 0; i < aLen; i ++)
          {
            pickedList[i] =  listA[i] + listB[i];

你有。

如果alen比blen长,那么如果你的forloop达到a的长度,你会得到一个错误,因为你有listB [i] - 你试图访问B的元素只是不在那里。

让我更清楚一点。让我们说数组a的长度为5,数组b的长度为3.a大于b,所以你从0到5循环i。对于i = 0,我会很好= 1,i = 2,但是一旦你得到i = 3,就没有listB [i],因为列表B只有一个位于0,1和2位置的elemnet,所以你得到了你得到的错误。

我希望有所帮助。祝你好运:)

答案 1 :(得分:1)

我会使用Math.max(int,int)来获取最大长度。然后声明新数组,然后迭代添加像

这样的元素的长度
public static int[] addArray(int[] listA, int[] listB) {
    int aLen = listA.length;
    int bLen = listB.length;
    int len = Math.max(aLen, bLen);
    int[] pickedList = new int[len];
    for (int i = 0; i < len; i++) {
        if (i < aLen && i < bLen) {
            pickedList[i] = listA[i] + listB[i];
        } else if (i < aLen) {
            pickedList[i] = listA[i];
        } else {
            pickedList[i] = listB[i];
        }
    }
    return pickedList;
}

答案 2 :(得分:1)

对于你的第一个if语句,你有aLen >= bLen然后在for循环中循环aLen的长度。在这个for循环中,您尝试在索引i处访问listB的元素。但是,由于listA较长,因为listA的长度比listB的长度长,所以元素listB[i]将不存在。

答案 3 :(得分:0)

public static int[] AddArray(int[] listA, int[] listB)
{
  int smallList[], bigList[], sums[];
  int pos;
  if (listA.length >= listB.length) {
    smallList = listB;
    bigList = listA;
  } else {
    smallList = listA;
    bigList = listB;
  }
  sums = new int[bigList.length];
  for (pos=0; pos < smallList.length; ++pos) {
    sums[pos] = smallList[pos] + bigList[pos];
  }
  for (; pos < bigList.length; ++pos) {
    sums[pos] = bigList[pos];
  }
  return sums;
}

答案 4 :(得分:0)

如果有两个数组

arr1 = [1, 2, 3, 4, 5]
arr2 = [6, 7, 8]

我们可以使用较低长度的两个数组作为循环条件(ind < lower_length)来摆脱异常。例如,

int array1_length = arr1.length; // 5
int array2_length = arr1.length; // 3

然后我们可以获得下限这样的方式

int limit = (array1_length > array2_length) ? array2_length : array1_length;

int limit = Math.max(array1_length, array2_length);

然后可以使用for循环中的限制,例如

for(int ind = 0; ind < limit; ind++){
    //sum = arr1[ind] + arr2[ind];
}

我希望它会对你有所帮助。

答案 5 :(得分:0)

试试这个:

 public static int[] AddArray(int[] listA, int[] listB)

    { 
    int aLen = listA.length;
    int bLen = listB.length;
    int[] pickedList = null;
    int i,j;
    //if array 1 is longer, make picklist have same number of elements then add
    //both array elements together
    if (aLen >= bLen)
    {     pickedList = new int[aLen];
          for(  i = 0; i < bLen; i ++)
          {
            pickedList[i] =  listA[i] + listB[i]; 
          }
          for( j = i; j < aLen; j++) // listB exhaust so add remaining elements of listA  to pickedList
          {
            pickedList[j] =  listA[j] ; 
          }
    }
     //if array 2 is longer, make picklist have same number of elements then add
    //both array elements together
    else 
    {
        pickedList = new int[bLen];
        for(  i = 0; i < aLen; i ++)
          {
            pickedList[i] =  listA[i] + listB[i] ;
          }   
        for( j = i; j < bLen; j ++)// listA exhaust so add remaining elements of listB  to pickedList
        {
          pickedList[j] =  listB[j]; 
        }
    }
        return pickedList;
 }