这是我在做rdf的sentence时候遇到的问题,本来以为是个很复杂的问题,最后才发现是一个不起眼的地方酿成的大错。
此问题可以简单示例成如下问题:
找到ArrayList a = {"a", "*", "*", "b", "*", "*", "c"}中为"*"的那些元素,并且将这些元素删除
开始的时候不假思索就写下了下面的代码
错误的写法
public static void guardProblem(ArrayList<String> a) {
for(int i = 0; i < a.size(); i ++) {
if(a.get(i).equals("*")) {
a.remove(i);
}
}
}
public static void main(String []args) {
ArrayList<String> a = new ArrayList<String>();
Collections.addAll(a, "a", "*", "*", "b", "*", "*", "c");
guardProblem(a);
System.out.println(a);
}
}
但是发现删除之后数组为[a, *, b, *, c],调试发现其中有两个*被跳过了。
原因:
删除的时候,a的size变了,因此这时候的i假如递增就不能够遍历整个数组了,应该在没有删除的时候递增,删除的时候保持i不变
正确的写法
public class Test {
public static void guardProblem(ArrayList<String> a) {
for(int i = 0; i < a.size();) {
if(a.get(i).equals("*")) {
a.remove(i);
} else {
i ++;
}
}
}
public static void main(String []args) {
ArrayList<String> a = new ArrayList<String>();
Collections.addAll(a, "a", "*", "*", "b", "*", "*", "c");
guardProblem(a);
System.out.println(a);
}
}
这时候的结果就正确了,删除之后a为[a, b, c]
分享到:
相关推荐
二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题二叉树遍历问题...
asp遍历文件夹删除多余文件,asp遍历文件夹删除多余文件
马的遍历问题马的遍历问题马的遍历问题马的遍历问题马的遍历问题
城市遍历求解问题 java课程设计 java设计 。。。。。。。。。。
读取指定的json文件内容,并进行键值遍历,打印输出。
遍历程序 遍历程序 遍历程序 遍历程序 遍历程序
List集合遍历和删除操作
QT遍历删除文件夹
二叉树遍历问题-二叉树遍历问题
马的遍历问题,实现遍历,在棋盘中
集合类的对象增加删除和遍历,代码直接可以使用,eclipse调试过
C# 遍历删除指定文件是一个完整的demo 可以直接运行 C# 遍历删除指定文件是一个完整的demo 可以直接运行
一次遍历单链表删除倒数第n个节点的问题,跟删除某个节点的前一个节点是一个思路
二叉树遍历问题 ⼀、⼆叉树的重要性 很多经典算法如 回溯、⼴度优先遍历、分治、动态规划等通常需要转化为树的问题,⽽树的题⽬难免涉及到递归的问题,因此掌握树的三 种遍历框架是必须的。 先序遍历:根,左,右 ...
课后作业:层次遍历先序遍历
json实现添加、遍历与删除属性的方法.docx
遍历地址工具遍历地址工具遍历地址工具遍历地址工具
图的遍历图的遍历图的遍历图的遍历图的遍历图的遍历图的遍历图的遍历
二叉树的递归遍历,中序遍历,先序遍历,后序遍历,通过学习二叉树的遍历,可以让我们更紧一步掌握数据的遍历