2017-06-26 2 views
0

J'ai 2 int listes A, B et 1 String Liste C. Ils ont tous le même longueur. Je veux regarder à travers C et enlever tout vide chaîne en plus des entrées de A et B, avec le même index. Ainsi, par exemple:Supprimer les entrées de plusieurs listes avec un iterator

A:[1, 2, 3]        A:[1, 3] 

B:[4, 5, 6]  should turn into  B:[4, 6] 

C:["C", "", B"]       C:["C", "B"] 

Mon code actuel ressemble à ceci:

int i = 0; 
for (Iterator<String> iterator = C.iterator(); iterator.hasNext();) { 
    String string = iterator.next(); 
    if (string.isEmpty()) { 
     // Remove the current element from the iterator and the list. 
     iterator.remove(); 
     A.remove(i); 
     B.remove(i); 
    } 
    i++; 
} 

Mais cela ne fonctionne pas.

Répondre

1

Vous pouvez éviter des indices tout à fait et juste itérer sur tous les trois listes en même temps:

List<Integer> a = new ArrayList<Integer>(Arrays.asList(1,2,3)); 
List<Integer> b = new ArrayList<Integer>(Arrays.asList(4,5,6)); 
List<String> c = new ArrayList<String>(Arrays.asList("a","","c")); 

Iterator<Integer> a_iterator = a.iterator(); 
Iterator<Integer> b_iterator = b.iterator(); 
Iterator<String> c_iterator = c.iterator(); 

while (c_iterator.hasNext() && b_iterator.hasNext() && a_iterator.hasNext()){ 
    a_iterator.next(); 
    b_iterator.next(); 
    String cString = c_iterator.next(); 
    if (cString == null || cString.isEmpty()){ 
    a_iterator.remove(); 
    b_iterator.remove(); 
    c_iterator.remove(); 
    } 
} 

Cela dit, j'essayerais d'éviter de traiter avec eux dans des listes séparées du tout. Essayer de garder les itérateurs et les index droits est source d'erreurs. Au lieu de cela, je serais en faveur d'une liste unique avec un objet plus complexe pour maintenir le Entiers associé et cordes:

public class ABC { 

private final Integer a; 
private final Integer b; 
private final String c; 

private ABC(Integer a, Integer b, String c){ 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

// Add Getters                                         

}

Alors je peux juste avoir List<ABC> et je sais toujours que j'ai le droit " b 'et' c 'associés à chaque' a 'et ainsi de suite. Vous pouvez itérer sur cette liste et supprimer l'ABC entier qui a un c vide. Si je contrôle le code qui produit les listes, je passe directement au List<ABC>. Si on me les donne comme ça, je les combinerais probablement encore, mais je peux juste les traiter tels quels s'ils ne sont pas beaucoup utilisés. En général, cependant, je n'aime pas avoir à écrire du code pour maintenir la relation implicite entre les listes.

3

Lorsque vous supprimez un élément par son index, les indices de tous les éléments suivants sont décrémentés, vous devez ajuster votre code pour que:

int i = 0; 
for (Iterator<String> iterator = C.iterator(); iterator.hasNext();) { 
    String string = iterator.next(); 
    if (string.isEmpty()) { 
     // Remove the current element from the iterator and the list. 
     iterator.remove(); 
     A.remove(i); 
     B.remove(i); 
     // don't increment i in this case, since the former i+1'th element 
     // of A and B just became the new i'th element 
    } else { 
     i++; 
    } 
}