0

N個のアイテムを持つArrayListがあります。ArrayList を反復処理し、ArrayList 内の各項目を別の ArrayList 内の同等の項目に追加したいと考えています。私はこれを試しましたが、うまくいきません:

ArrayList<Integer> arrList1 = new ArrayList<Integer>();

for(String key: myMap.keyValues() {
    ArrayList<Integer> dynArrList = getArrayListFromSomewhereElse();

    for(Integer i : dynArrList) {
       arrList1.set(i, arrList1.get(i) + dynArrList.get(i)); // sum each item
    }
}

範囲外のインデックスの例外が発生します。arrList1 を初期化しようとしましたが、違いはありませんでした。また、最小サイズを設定しようとしました。

4

3 に答える 3

3

合計する整数の 2 つのリストが指定されていません。あなたはdynArrList加数として持っています、そしてあなたはarrList1結果のために持っています。しかし、問題をまだ本当に理解していないことを示す 2 番目の加数がありません。あなたの本当の仕事はあなたが思っているものではないか、どこからデータを取得しているかを正確に特定していません。

したがって、 が 2 つあるとしますList<Integer>。可能であればインターフェイスにプログラムします。項目ごとにどのように計算しますか? sum メソッドを作成し、2 つのリストのサイズが異なる場合に何が起こるかを認識します。

public List<Integer> sum(List<Integer> left, List<Integer> right) {
    if (left.size() != right.size()) {
        // A runtime exception you write saying that you can't add two
        // arrays of different sizes.
        throw new VectorShapeException(left.size(), right.size());
    }
    List<Integer> vectorSum = new ArrayList<>();
    for (int i = 0; i < left.size(); ++i) {
        vectorSum.add(left.get(i) + right.get(i));
    }
    return vectorSum;
}

追加したいものを特定し、これを使用します。

ここで、2 つの整数配列リストの内積を計算する割り当てがあったとします。1 つのリストの要素を合計するメソッドと、積のベクトルを取得するメソッドの 2 つが必要になる場合があります。おそらく中間リストは必要なく、スペースを浪費するため、これは無駄かもしれません。最初のタスクは簡単です。

public int sum(List<Integer> list) {
    int total = 0;
    for(Integer element: list) {
        total += element;
    }
   return total;
}

2 つ目は簡単です。コピーして名前を変更するだけです:

public List<Integer> product(List<Integer> left, List<Integer> right) {
    if (left.size() != right.size()) {
        // A runtime exception you write saying that you can't multiply two
        // arrays of different sizes.
        throw new VectorShapeException(left.size(), right.size());
    }
    List<Integer> vectorProd = new ArrayList<>();
    for (int i = 0; i < left.size(); ++i) {
        vectorProd.add(left.get(i) * right.get(i));
    }
    return vectorProd;
}

public int dotProduct(List<Integer> left, List<Integer> right) {
    return sum(product(left, right));
}

しかし、ここで厄介な問題があります。切り貼りと修正は、私がそこまで考えていなかったことの表れです。2 引数の sum メソッドと product メソッドの唯一の実際の違いは、演算子と名前です。これは関数型プログラミングにつながりますが、これはおそらく今のところ多すぎます。

于 2013-04-24T18:27:22.793 に答える
1

範囲外のインデックス例外はループから発生しています:

for(Integer i : dynArrList) {
    arrList1.set(i, arrList1.get(i) + dynArrList.get(i));
}

この場合i、リストへのインデックスではありません。iリストに要素があるという保証はありません。おそらくfor、これには標準のループが必要です。

for(int i = 0; i < dynArrList.size(); i++) {
    arrList1.set(i, arrList1.get(i) + dynArrList.get(i));
}

また、何らかの合計を計算する場合は、2 つのリストの要素数が同じであること、または 2 つのリストの短い方の長さまでしか計算しないことを確認する必要があります。

于 2013-04-24T17:53:48.097 に答える
0

arrList1 に何も含まれていない場合、どのように要素を arrList1.get(i) + dynArrList.get(i) に設定しますか? arrList1 値が設定されているステップが欠落している必要があります。例に書かれているように、拡張可能なリストには .set の代わりに .add を使用します。

ArrayList<Integer> arrList1 = new ArrayList<Integer>();//has no values and no size

ArrayList<Integer> dynArrList = getArrayListFromSomewhereElse();

for(Integer i : dynArrList) {
   arrList1.add(i); // sum each item
}

または、中間の ArrayList を使用してマージ/最終リストを実行します。

ArrayList<Integer> arrList1 = getArrayFromALocation();//may have values and size
ArrayList<Integer> dynArrList = getArrayListFromSomewhereElse();
ArrayList<Integer> mergedList1 = new ArrayList<Integer>();

for(int i =0; i<  dynArrList.size(); i++) {//assuming larger
if ( i < arrList1 .size() )
   mergedList1.add(new Integer(dynArrList.get(i).intValue()+(arrList1 .get(i).intValue())); // sum each item
else
    mergedList1.add(new Integer(dynArrList.get(i).intValue()+0));
}
}
return mergedList1;
于 2013-04-24T18:37:25.367 に答える