在for循环中删除 - JAVA

时间:2015-08-17 18:26:43

标签: java list loops for-loop arraylist

因此,假设我有一个迭代字符串列表的for循环。 字符串列表类似于

List<String> myString = {NEW ROW, cs, 1, 2, 3, NEW ROW, tp, 3, 4, 5}

我希望for循环遍历列表并在每次NEW ROW出现在列表中之后删除NEW ROW和下一个x元素。

我该怎么做?

我的尝试:

 for (int index = 0; index < myList.size(); index++) {

        if (myList.get(index).equals("NEW ROW")) {
            for (int j = index; j < index + x; j++) {
                myList.remove(j);
            }
            index = index + x;

        } 
    }

我的尝试无效。

2 个答案:

答案 0 :(得分:6)

您可以使用list iterator来简化代码,并避免完全使用索引数学:

for (Iterator<String> iterator = myString .iterator(); iterator.hasNext();) {
    String string = iterator.next();
    if (string.equals("NEW ROW")) {
        // Call iterator.remove() x times,
        // or until the list runs out of elements
        for (int i = 0 ; iterator.hasNext() && i != x ; i++) {
            iterator.remove();
        }
    }
}

这适用于LinkedList实施。如果您使用ArrayList实现,那么最好在一个循环中完成所有操作:

int read = 0, write = 0;
while (read < myList.size()) {
    String s = myList.get(read);
    if (s.equals("NEW ROW")) {
        read += x;
    } else {
        myList.set(write++, s);
        read++;
    }
}
// Trim the end of the list
for (int last = myList.size()-1 ; last >= write ; last--) {
    myList.remove(last);
}

此实现将您要保留的项目移动到列表的开头,然后修剪结束元素。

答案 1 :(得分:3)

您只是不删除列表中的元素...您不能修改数据结构。好的,但你不这样做。

使用您要查找的条件构建另一个ListSet,这样更容易,并且您保留了所提供的列表,实际上,您不知道是否要需要进一步(或不需要)。

<强>更新

看看这个:

final List<String> myList = Lists.newArrayList("NEW ROW", "cs", "1", "2",
    "3", "NEW ROW", "tp", "3", "4", "5"); // Guava's way
final List<String> result = new LinkedList<>();
final int TIMES = 2;
int x = 0;

for (String value : myList) {
  if (x > 0) {
    x--;
  } else {
    if ("NEW ROW".equals(value)) {
      x = TIMES;
    } else {
      result.add(value);
    }
  }
}
System.out.printf("%s%n", result);