1

我的程序中的一种方法有问题。该方法旨在采用 2 个数组列表,并像多项式一样在两者之间执行乘法运算。

例如,如果我要说list1={3,2,1}and list2={5,6,7}; 我试图获得一个返回值15,28,38,20,7。但是,我能得到的只是一条错误消息,上面写着:

线程“main”中的异常java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

我提供了以下方法:

private static ArrayList<Integer> multiply(ArrayList<Integer> list1,ArrayList<Integer> list2) {

    ArrayList<Integer> array =new ArrayList<Integer>(list1.size()+list2.size());

    for (int i=0;i<array.size();i++)
        array.add(i, 0);

    for (int i = 0; i < list1.size(); i++)

        for (int j = 0; j < list2.size(); j++)

            array.set(i+j, ((list1.get(i) * list2.get(j))+array.get(i+j)));

    return array;

}

非常感谢解决此问题的任何帮助。

4

3 回答 3

2

将您的第一个 for 循环更改为:

for (int i = 0 ; i < list1.size() + list2.size() ; i++)
    array.add(0);

正如你所拥有的那样,array.size()最初是0这样的,甚至永远不会进入第一个 for 循环,所以没有任何东西被添加到array. 的ArrayList容量与其大小不同。

于 2012-09-09T03:15:39.170 回答
0

(i+j)在总结之前,您可能需要检查是否存在一个元素。所以这样做

int elementAtLoc = 0;
if(array.size() > i+j && array.get(i+j) != null ){
   elementAtLoc = array.get(i+j);
}
array.set(i+j, ((list1.get(i) * list2.get(j))+elementAtLoc));

而且不需要这个:

for (int i=0;i<array.size();i++)
    array.add(i, 0);

因为我们正在处理0第二个循环本身的设置。它为您节省了额外的循环工作以添加零

于 2012-09-09T03:13:58.407 回答
0

看看这些代码:

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer.
 */
private transient Object[] elementData;

/**
 * The size of the ArrayList (the number of elements it contains).
 *
 * @serial
 */
private int size;

public ArrayList(int initialCapacity) {
super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
this.elementData = new Object[initialCapacity];
}

public int size() {
   return size;
}

此时,您必须通过构造函数创建一个实例,他们没有分配变量“size”,其中包含实际元素的数量。这就是你得到这个异常的原因。

于 2012-09-09T03:33:56.893 回答