-1

少し問題があります。ArrayList からオブジェクトを削除しようとしていますが、変更が行われません。

コードサンプルは次のとおりです。

    List<Room> rooms = new CopyOnWriteArrayList<Room>();

    rooms.addAll(fp.getRooms());
    int counter = 1;

    for(Room r: rooms){
        for(Square s: r.getDoor()){
            r.getDoor().remove(s);
            String name = String.valueOf(fp.getRooms().size() + counter);
            Room doorRoom = new Room(name, false, s, s);
            rooms.add(doorRoom);
            counter++;
        }
    }

    fp.setRooms(rooms);

オブジェクトを削除sして新しいオブジェクトに置き換えようとしていますdoorRoom

出力:

まず> [S: 11:7; 真、S: 11:15; 真、S: 11:20; 真実]
セカンド> [S: 11:7; 真、S: 11:15; 真、S: 11:20; 真実]

そして、私は期待しています:

まず> [S: 11:7; 真、S: 11:15; 真、S: 11:20; 真実]
2番目> [S:11:15; 真、S: 11:20; 真実]

など...

何が問題ですか?

ありがとうございます。返信をお待ちしております。

4

3 に答える 3

1

OK、あなたのコードには2つの問題があります:

  1. 実際には「r」を削除していません。「r」に関連付けられているドアから正方形のみを削除します。
  2. 拡張 for ループ内のオブジェクトを削除することはできません。これには反復子を使用する必要があります ( Java の foreach ループで remove を呼び出す を参照)。オブジェクトを反復処理中にコレクションに追加できるかどうかは完全にはわかりません ( Java: 反復中にコレクションに要素を追加する を参照) 。 .

問題を解決するには、リンクの説明に従ってください

于 2013-02-24T20:17:08.610 に答える
0

実際には、反復中にリストを変更できますが、直接変更することはできません (スローされますConcurrentModificationException)。それを行うために使用するだけListIteratorです。元:

    List<String> l = new ArrayList<>();
    l.add("a");
    l.add("b");
    l.add("c");

    for (ListIterator<String> it = l.listIterator(); it.hasNext();) {
        String s = it.next();
        if ("b".equals(s)) {
            it.remove();
            it.add("r");
        }
    }

    assertFalse(l.contains("b"));
    assertTrue(l.contains("r"));
于 2013-02-24T20:37:31.413 に答える
0

for (Square s: r.getDoor())内部で反復子を使用し、反復処理中に ArrayList を変更することはできません。ループ変数 ( for (int i = 0;...)) を使用すると機能しますが、リストの長さが変化し、一部のオブジェクトがループからチェックアウトされないままになるため、これはお勧めできません。

削除するオブジェクトを覚えておいてから、ループ後に削除する必要があります。

于 2013-02-24T20:18:32.213 に答える