0

コレクションを作成し、それもコレクションである要素で埋めましたが、foreach構築 (または他の方法) を使用してこのコンテナーを反復処理しようとすると、何も返されません。適切な数)しかし、各コレクション内の空ではないコンテナはnullのようです

コード スニペットの例:

Item it1, it2;
List<Collection<Item>> hull = new ArrayList<Collection<Item>>();
List<Item> seq = new ArrayList<Item>();
seq.add(it1);
hull.add(seq);
seq.clear();
seq.add(it2);
hull.add(seq);
for (<Collection<Item> c: hull)
      System.out.println(c);

これは、私が行っていることの単純化されたスニペットです。代替案を提案してください。どこで間違いを犯したのですか?

4

3 に答える 3

4

呼び出すseq.clear()たびに、内側の ArrayList を空にします。コレクションにオブジェクトを追加するときは、参照のみを追加することを忘れないでください。オブジェクトを複製しません。反復ごとに新しい ArrayList オブジェクトを作成する必要があります。

例えば

List<Collection<Item>> hull = new ArrayList<Collection<Item>>();
List<Item> seq = new ArrayList<Item>();
seq.add(it1);
hull.add(seq);
List<Item> seq2 = new ArrayList<Item>();
seq2.add(it2)
hull.add(seq2);

編集:

コンパイルする完全なサンプル:

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

public class NewClass1 {

    static class Item {

        String a;

        public Item(String a) {
            this.a = a;
        }
        @Override
        public String toString() {
            return a;
        }
    }

    public static void main(String[] args) {
        List<Collection<Item>> hull = new ArrayList<Collection<Item>>();
        List<Item> seq = new ArrayList<Item>();
        Item it1 = new Item("item 1");
        seq.add(it1);
        hull.add(seq);
        List<Item> seq2 = new ArrayList<Item>();
        Item it2 = new Item("item 2");
        seq2.add(it2);
        hull.add(seq2);

        for (Collection<Item> current : hull) {
            for (Item item : current) {
                System.out.println(item);
            }
        }
    }
}

出力:

run:
item 1
item 2
于 2013-03-07T21:14:42.150 に答える
2

コンパイルするように修正されたコード:

package sample;

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

public class Item {
   public static void main( String[] args ) {
      List< List< Item >> hull = new ArrayList<>();
      List< Item >        seq = new ArrayList<>();
      seq.add( new Item());
      hull.add( seq );
      seq = new ArrayList<>(); // in place of seq.clear();
      seq.add( new Item());
      hull.add( seq );
      for( List<Item> c: hull ) {
         System.out.println( c.get( 0 ));
      }
   }
}

出力:

sample.Item@6da264f1
sample.Item@40914272

ご覧のとおり、問題はありません。

于 2013-03-07T21:21:31.303 に答える
0

コレクションのコレクションを反復するには、ネストされた foreach が必要です。

    for(Collection<Item> c: hull)
    {
        for(Item i: c)
        {

        }
    }

ところで、it1 と it2 が初期化されておらず、それが原因で何も得られていないことに気付いていますか?

size() は常にコレクションのサイズを示しますが、null が含まれている可能性があります (あなたの場合)。

于 2013-03-07T21:18:01.080 に答える