6

イテレータを使用して、Java のオブジェクトのコレクションをループします。ただし、イテレータの使用については少し混乱しています (for each ループの使用に慣れています)。次のようなコードがあるとしましょう:

Iterator<Organization> orgIter = orgs.iterator();
while (orgIter.hasNext()) {
    Organization orgObj = orgIter.next();
    orgObj.setChildOrgsTree(generateOrgChildTree(orgObj, new ArrayList<Organization>()));
}

新しいオブジェクトを作成し、オブジェクト内のフィールドを変更します。私の計画は、イテレータを作成した元のオブジェクトを、作成したこのオブジェクトのリストと等しくなるように設定することでした (リストは上に示されていませんが、必要になることがわかりました)。

しかし、これらすべてを行うために新しいオブジェクトを作成する必要がなければ、はるかに簡単になります。現在のオブジェクトを取得して変更する方法はありますか?

4

2 に答える 2

4

これを試して:

for(Organization org : orgs)
    org.setChildOrgsTree(generateOrgChildTree(org, new ArrayList<Organization>());
于 2012-06-21T12:29:03.067 に答える
3

Listイテレータがorインスタンスを反復するQueue場合、制限は少なくなります。リストの構造を変更しない限り、 によって返されるオブジェクトを使用して、好きなことを行うことができますIterator.next()。もちろん、その特定のオブジェクトのクラスは変更できるはずですが、必要なコードを追加できると思います...

一方、 Iterator オブジェクトを無効にせずに許可される唯一のリスト構造の変更は、 を使用して現在の要素を削除することIterator.remove()です。これはオプションの操作です。リストを直接変更しようとすると、イテレータが無効になりConcurrentModificationException、次に使用しようとすると が返されます。

さらに、 を反復処理する場合、Set通常ははるかに制限されます。実際のSet実装の詳細によっては、通常、オブジェクトの任意のフィールドを変更することはできません。たとえば、オブジェクトが...hashCode()に挿入されると、 によって返される値は変更されません。HashSet

補足として、for-eachJava のループは、Iterator. を使用しない場合は、明示イテレータの代わりにループをIterator.remove()使用してください。for-each

于 2012-06-21T12:23:22.837 に答える