Ciao, sto cercando di capire quali sono i metodi corretti per iterare su una lista e modificarla contestualmente.
Mettiamo, per esempio, che io voglia convertire tutti gli elementi di una lista in maiuscolo utilizzando il metodo
private static void convertToUppercaseStrings(List<String> list1)
Utilizzando un ListIterator, potrei scrivere:
private static void convertToUppercaseStrings(List<String> list1) {
ListIterator <String> iterator = list1.listIterator();
while(iterator.hasNext()){
iterator.set(iterator.next().toUpperCase());
}
}
NON posso, invece, modificare la lista attraverso un for-each
(for Element e : list)
, come in
private static void convertToUppercaseStrings(List<String> list1) {
int i = 0;
for(String s : list1){
String upperCase = s.toUpperCase();
list1.remove(s);
list1.add(i, upperCase);
}
}
In questo caso, il metodo lancia una java.util.ConcurrentModificationException.
Il metodo con il for "standard" cioè
private static void convertToUppercaseStrings(List<String> list1) {
for(int i = 0; i < list1.size(); i++){
String upperCase = list1.get(i).toUpperCase();
list1.remove(i);
list1.add(i, upperCase);
}
}
no dà problemi di compilazione e produce un autput corretto.
Il metodo quindi può essere utilizzato?
L'iteratore deve essere NECESSARIAMENTE utilizzato solo quando si usa un for-each?