Frage Ist es möglich, den Index einer for-each-Schleife in Java zu erhalten?


Mit dem folgenden Code ist es möglich, den Index von zu entfernen p aus der Eigenschaftenliste mit dieser Art von for-Schleife in Java?

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'
    }
}

So würde ich dies mit dem anderen erreichen for Schleife

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);
        }
}

17
2017-07-19 15:33


Ursprung


Antworten:


Der Weg dazu ist mit einem expliziten Iterator (keine Schule wie die alte Schule!).

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

Im Gegensatz zur Remove-Methode in einer Liste remove Methode auf dem Iterator verursacht keine gleichzeitige Änderung. Es ist die einzige sichere Methode, ein Element aus einer Sammlung zu entfernen, über die Sie iterieren. Wie der Javadoc für diese Methode sagt:

Das Verhalten eines Iterators ist nicht spezifiziert, wenn die zugrunde liegende Sammlung während der Iteration auf andere Weise geändert wird als durch Aufrufen dieser Methode.


27
2017-07-19 15:40



Nein, Sie müssen die Old-School-Schleife verwenden, um einen Index zu erhalten.

Sie könnten es natürlich selbst in die for-each-Schleife einfügen, aber dann wäre es wahrscheinlich besser, stattdessen die alte Variante zu verwenden.


8
2017-07-19 15:35



Wie wäre es mit dem richtigen Gebrauch? Iterator und sein remove Methode?

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( );
    }
}

8
2017-07-19 15:40



Wie Tim Anderson vorgeschlagen hat, könnten Sie die Liste auch außerhalb der Schleife ändern

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);

2
2017-07-19 15:45



Soweit ich weiß, garantiert foreach loop nicht die Reihenfolge der Elemente, die es aufzählt,

Wenn Sie also Collection [i] ausprobieren, können Sie ein anderes Element als das aktuelle iterieren

Es ist in einigen Multithread-Fällen klar zu sehen


1
2017-07-19 15:40