17

以下のコードを考えると、pJava でこのスタイルの for ループを使用して、プロパティ リストから のインデックスを削除することは可能ですか?

List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";

for(Properties p : propertiesList) {
    if(p.getKey().equals(keyToDelete)) {
        propertiesList.remove(index) //How to remove the element at index 'p'
    }
}

forこれは、他のループでこれを達成する方法です

List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";

for(int i = 0; i < propertiesList.size(); i++) {
        if(p.getKey().equals(keyToDelete)) {
                propertiesList.remove(i);
        }
}
4

5 に答える 5

27

これを行う方法は明示的ですIterator(古い学校のような学校はありません!)。

Iterator<Properties> it = propertiesList.iterator();
while (it.hasNext()) {
    if (it.next().getKey().equals(keyToDelete)) {
        it.remove();
    }
}

リストの remove メソッドとは異なり、remove反復子のメソッドは同時変更を引き起こしません。反復処理中のコレクションから要素を削除する唯一の安全な方法です。そのメソッドのjavadocが言うように:

反復の進行中に、このメソッドを呼び出す以外の方法で基になるコレクションが変更された場合、反復子の動作は規定されていません。

于 2012-07-19T15:40:29.740 に答える
8

いいえ、古い学校の for ループを使用してインデックスを取得する必要があります。

もちろん、for-each ループに自分で追加することもできますが、代わりに古いバリアントを使用した方がよいでしょう。

于 2012-07-19T15:35:25.487 に答える
8

適切な方法Iteratorとそのremove方法を使用してはどうですか?

List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";

for (
    Iterator<Properties> iter = propertiesList.iterator( );
    iter.hasNext( );
)
{
    Properties p = iter.next( );

    if(p.getKey().equals(keyToDelete)) {
        iter.remove( );
    }
}
于 2012-07-19T15:40:51.910 に答える
2

Tim Anderson が提案したように、ループの外でリストを変更することもできます

List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";
List<Properties> propertiesToRemove = new ArrayList<Properties>();


for(Properties p : propertiesList) {
    if(p.getKey().equals(keyToDelete)) {
        propertiesToRemove.add(p) ;
    }
}

propertiesList.removeAll(propertiesToRemove);
于 2012-07-19T15:45:29.240 に答える
1

私の知る限り、foreach ループは列挙する要素の順序を保証しません。

したがって、 Collection[i] を試すと、現在反復されている要素ではなく、別の要素を取得できます

一部のマルチスレッドのケースでは明確に表示できます

于 2012-07-19T15:40:22.580 に答える