1

プログラムのメソッドの1つに問題があります。このメソッドは、2つの配列リストを取得し、多項式のように2つの間の乗算を実行するように設計されています。

たとえば、私が言うlist1={3,2,1}としたら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);

02番目のループ自体で設定を行っているので。ゼロを追加するだけでループする余分な作業を節約できます。

于 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 に答える