Умножение полиномов Java с помощью ArrayList

У меня проблема с одним из моих методов в моей программе. Метод предназначен для использования двух массивов и выполнения умножения между ними, как полином.

Например, если бы я сказал list1={3,2,1} и list2={5,6,7}; Я пытаюсь получить возвращаемое значение 15,28,38,20,7. Однако все, что я могу получить, это сообщение об ошибке, в котором говорится:

Исключение в потоке "основной" 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;

}

Любая помощь в решении этой проблемы приветствуется.


person user1506919    schedule 09.09.2012    source источник
comment
Да, и список1, и список2 работают нормально, когда я вызываю другие методы (например, метод добавления и вычитания)   -  person user1506919    schedule 09.09.2012


Ответы (3)


Измените свой первый цикл for на:

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

Как у вас есть, array.size() изначально равно 0, так что первый цикл for никогда даже не вводится, поэтому ничего не добавляется к array. Вместимость ArrayList — это не то же самое, что его размер.

person arshajii    schedule 09.09.2012

Вы можете проверить, существует ли элемент в (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 во втором цикле. Это избавляет вас от дополнительной работы по зацикливанию только для добавления нулей.

person Nishant    schedule 09.09.2012

Взгляните на эти коды:

/**
 * 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;
}

В настоящее время вы должны создать экземпляр с помощью конструктора, у которого нет присвоения переменной «размер», где она содержит количество фактических элементов. Вот почему вы получаете это исключение.

person cat_minhv0    schedule 09.09.2012