使用一个迭代器删除多个列表的条目

时间:2017-06-26 18:37:42

标签: java iterator listiterator

我有2个int个列表 A B 和1个String列表 C 。它们都具有相同的长度。我想查看C并删除除A和B条目之外的所有字符串,并使用相同的索引。例如:

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

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

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

我目前的代码如下:

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

但这不起作用。

2 个答案:

答案 0 :(得分:3)

当您通过索引删除元素时,所有以下元素的索引都会递减,因此您必须调整代码:

<style>
.s4-wpcell-plain{
text-align: -webkit-center;
text-align: center
}
</style>

答案 1 :(得分:1)

您可以完全避免索引,只是同时遍历所有三个列表:

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

那就是说,我会尽量避免在单独的名单中处理它们。试图保持迭代器和索引直接是容易出错的。相反,我倾向于使用一个包含更复杂对象的列表来保存关联的整数和字符串:

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                                                                                                                                                                   

}

然后我可以List<ABC>而且我总是知道我有正确的'b'和'c'与每个'a'相关联等等。您可以遍历该列表并删除具有空白c的整个ABC。如果我控制产生列表的代码,我会直接跳到List<ABC>。如果他们像这样给我,我可能仍然会把它们结合起来,但如果它们用得不多,我可能会按原样处理它们。但是,一般情况下,我不喜欢编写代码来维护列表之间的隐含关系。