因此,假设我有一个迭代字符串列表的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;
}
}
我的尝试无效。
答案 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)
您只是不删除列表中的元素...您不能修改数据结构。好的,但你不这样做。
使用您要查找的条件构建另一个List
或Set
,这样更容易,并且您保留了所提供的列表,实际上,您不知道是否要需要进一步(或不需要)。
<强>更新强>
看看这个:
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);