2

私は英語が苦手で、プログラミングの初心者なので、しばらくお待ちください。

最初に私のコードを見て、私が問題を抱えていることをよりよく理解してください。

という名前のオブジェクトを作成しましたObjAbc.java:

package exer;

public class ObjAbc {
    private Integer code;
    private Integer value;

    public ObjAbc () {

    }

    public ObjAbc (Integer code, Integer value) {
            this.code = code;
            this.value = value;
    }

    public Integer getCode() {
            return code;
    }

    public void setCode(Integer code) {
            this.code = code;
    }

    public Integer getValue() {
            return value;
    }

    public void setValue(Integer value) {
            this.value = value;
    }

    @Override
    public String toString() {
           return "ObjAbc [code=" + code + ", value=" + value + "]";
    }
}

それから私はクラスを持っていますObjAbcTest.java

package exer;

import java.util.ArrayList;
import java.util.List;

public class ObjAbcTest {

    public static List<ObjAbc> populateList() {
        List<ObjAbc> objAbcs = new ArrayList<ObjAbc>();
        objAbcs.add(new ObjAbc(1, 11));
        objAbcs.add(new ObjAbc(2, 25));
        objAbcs.add(new ObjAbc(3, 125));
        objAbcs.add(new ObjAbc(4, 73));
        objAbcs.add(new ObjAbc(5, 12));
        objAbcs.add(new ObjAbc(1, 12));
        objAbcs.add(new ObjAbc(3, 1));
        return objAbcs;
    }

    public static void main(String[] args) {
        List<ObjAbc> list = populateList();
        List<ObjAbc> newList = new ArrayList<ObjAbc>();
        for (ObjAbc o : list) {
            if (!newList.isEmpty()) {
                for (ObjAbc n : newList) {
                    if (o.getCode().intValue() == n.getCode().intValue()) {
                        n.setValue(n.getValue() + o.getValue());
                        break;
                    } 
                    else {
                        newList.add(o);
                    }
                }
            } 
            else {
                newList.add(o);
            }
        }

        for (ObjAbc n : newList) 
            System.out.println(n.toString());
    }
}

私がやろうとしてObjAbcいるのは、同じコードを持つすべての値ObjAbcを合計することですが、値を合計した後に他の値を削除します。つまり、オブジェクトを一度表示する必要がありますが、値は合計でなければなりません。

例:

入力:

ObjAbc [code=1, value=11]
ObjAbc [code=2, value=25]
ObjAbc [code=3, value=125]
ObjAbc [code=4, value=73]
ObjAbc [code=5, value=12]
ObjAbc [code=1, value=12]
ObjAbc [code=3, value=1]

期待される出力:

ObjAbc [code=1, value=23]
ObjAbc [code=2, value=25]
ObjAbc [code=3, value=126]
ObjAbc [code=4, value=73]
ObjAbc [code=5, value=12]

しかし、私が得るものは次のとおりです。

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    at java.util.AbstractList$Itr.next(AbstractList.java:343)
    at exer.ObjAbcTest.main(ObjAbcTest.java:25)
4

5 に答える 5

1

経由で newList を変更しています

 newList.add() 

リストを繰り返しながら:

 for (ObjAbc n : newList)

イテレータを無効にします。

たとえば、反復中にリストを変更できる ListIterator を使用できます。例えば:

 ListIterator<ObjAbc> li = newList.listIterator();
 while (li.hasNext()) {
    ObjAbc n = li.next();
    if (...) 
    else {
      li.add(...)
    }
 }
于 2013-09-23T05:07:08.570 に答える
0

Java の for each ループは、暗黙的な反復子を使用します。また、ArrayList の反復子は、設計上フェイルファストです。基になる構造 (リスト) の変更を検出するとすぐにConcurrentModificationExceptionをスローします。

基本的に、リストは現在「変更」されており、イテレータはリストの以前の状態に対応しています。ランタイムはこれを検出し、例外をスローします。

このような場合の対処方法については、こちらをお読みください。

于 2013-09-23T05:07:10.490 に答える
0
newList.add(o);

コレクションを繰り返し処理している間は、それを変更することはできません。

それが追加中の問題です。

できることは、単に別のリストを取得して項目を追加するだけです。

于 2013-09-23T05:07:36.673 に答える