2


0

Java ArrayListヘルプ

したがって、文字列「A」、「B」、「C」、「D」、「E」を含むlist1という文字列のArrayListがあるとします。 次に、storageUnit型の別のArrayListがあります。これは、list2と呼ばれる、作成したクラスです。 より良い説明については、以下のコードを参照してください。

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

storageUnit newUnit = new storageUnit();
for (int i = 0; i < list1.size(); i++) {
    newUnit.category = list1.get(i);
    list2.add(newUnit);
}

static class storageUnit {
    String category;
    Hashtable wordTable = new Hashtable();
};

list2のすべてのstorageUnitsのすべてのカテゴリを印刷しようとすると、[A、B、C、D、E]ではなく[E、E、E、E、E]を取得します。 なぜこれが起こっているのか説明できますか?

6 Answer


6


変化する

storageUnit newUnit = new storageUnit();
for (int i = 0; i < list1.size(); i++) {
    newUnit.category = list1.get(i);
    list2.add(newUnit);
}

to

for (int i = 0; i < list1.size(); i++) {
    storageUnit newUnit = new storageUnit();
    newUnit.category = list1.get(i);
    list2.add(newUnit);
}

コードが行っていたのは、単一のオブジェクト( newUnit)を作成し、それを複数回リストに追加することでした。 毎回、そのカテゴリを上書きするため、リストを印刷したときに同じ値が複数回取得されます。

代わりに、毎回新しい `newUnit`オブジェクトを作成する必要があります。


2


newlistを list2`に追加すると、 storageUnit`の同じインスタンスが5回追加されます。 つまり、いずれかを変更すると、残りも変更されます。 `list2`に追加するたびに新しいストレージユニットを宣言する必要があります。

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();


for (int i = 0; i < list1.size(); i++) {
    storageUnit newUnit = new storageUnit();
    newUnit.category = list1.get(i);
    list2.add(newUnit);
}

static class storageUnit {
    String category;
    Hashtable wordTable = new Hashtable();
};


1


私はそれが `list1.get(i)`であるべきだと思うし、またループ内に新しいユニットを作成する必要があります


1


1)クラスの名前は大文字で始めてください。 storageUnitではなくStorageUnitである必要があります。

2)newUnitをループ外で作成します。 次に、同じユニットをリストに5回追加します。 代わりに試してみてください。

for (int i = 0; i < list1.size(); i++) {
    storageUnit newUnit = new storageUnit();
    newUnit.category = list1.get(0);
    list2.add(newUnit);
}


1


ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();


for (int i = 0; i < list1.size(); i++) {
    storageUnit newUnit = new storageUnit();
    newUnit.category = list1.get(i);
    list2.add(newUnit);
}

static class storageUnit {
    String category;
    Hashtable wordTable = new Hashtable();
};

物事のカップル。 ループの各反復でlist1 ArrayListの最初の要素を取得していました。 また、ループ外で作成されたnewUnitオブジェクトの参照の問題がありました。 一度作成して、ArrayListに何度も挿入しました。 ArrayListはそのONEオブジェクトを何度も指し示しました。 ループの最後の反復では、ユニットに「E」値が設定されるため、ArrayList(list2)のすべてのエントリは、「E」の値を持つ同じユニットを指していました。


0


これを試して..

forループの反復中に、* same object(newUnit.category)は値を取得するためにカテゴリに対して初期化されます。 以下のコーディングを使用する場合、反復ごとにカテゴリの値が上書きされます。*

  • storageUnit newUnit = new storageUnit(); *

for (int i = 0; i < list1.size(); i++) {
    newUnit.category = list1.get(i);
    list2.add(newUnit);
}
  • storageUnit newUnit = new storageUnit(); *をforループに入れて、反復ごとに新しいオブジェクトを作成できるようにします。値はオーバーライドしません。

 for (int i = 0; i < list1.size(); i++) {
        storageUnit newUnit = new storageUnit();
        newUnit.category = list1.get(i);
        list2.add(newUnit);
    }

お役に立てば幸いです