Java 嵌套遍历列表,然后进行最终删除
我正在尝试遍历一个列表,同时已经在其中循环(嵌套循环)。考虑下面的代码:Java 嵌套遍历列表,然后进行最终删除,java,oop,loops,iterator,Java,Oop,Loops,Iterator,我正在尝试遍历一个列表,同时已经在其中循环(嵌套循环)。考虑下面的代码: ArrayList<Integer> list = new ArrayList<Integer>(); // add some values to it for(int i : list) { // ConcurrentModificationException Iterator iterator = list.iterator(); while(iterator.hasNext(
ArrayList<Integer> list = new ArrayList<Integer>(); // add some values to it
for(int i : list) { // ConcurrentModificationException
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
int n = iterator.next();
if(n % i == 0) {
iterator.remove();
}
}
}
ArrayList list=new ArrayList();//给它添加一些值
对于(int i:list){//ConcurrentModificationException
迭代器迭代器=list.Iterator();
while(iterator.hasNext()){
int n=迭代器.next();
如果(n%i==0){
iterator.remove();
}
}
}
上面的示例导致ConcurrentModificationException。当然,删除元素的条件只是一个示例
我确信我只是错过了一些东西;但是我应该如何构造一个循环,在Java中实现相同的功能而不引发异常?您不能从正在迭代的列表中删除一个项。一个选项是将您需要的项目添加到另一个列表中。最后,你有一个清单,上面有你需要的物品。或者您可以迭代原始列表的克隆。您将获得
ConcurrentModificationException
,因为在执行for
循环时,您正在尝试修改列表
我不确定以下是否是一个优雅的解决方案,但类似于以下的方法可能会奏效:
Iterator<Integer> iterator = list.iterator();
int i=1;
while (iterator.hasNext()) {
int n = iterator.next();
if (n % i == 0) {
iterator.remove();
}
i++;
}
Iterator Iterator=list.Iterator();
int i=1;
while(iterator.hasNext()){
int n=迭代器.next();
如果(n%i==0){
iterator.remove();
}
i++;
}
我做的事情和你很相似。请看一下这个密码
out:for(int h=0; h<tempAl.size(); h++) {
if(tempAl.get(0).split("\\s")[0].equals("OFF")){
tempAl.remove(0);
h=-1;
continue;
}
if(tempAl.get(h).split("\\s")[0].equals("ON")){
ONTime= tempAl.get(h);
///rest fof the code
}
out:for(int h=0;h当您在列表上迭代时,明显地修改列表,导致执行选项。
您可以使用另一个列表来维护要删除的元素列表,并在最后删除它们
ArrayList<Integer> list = new ArrayList<Integer>(); // add some values to it
ArrayList<Integer> del = new ArrayList<Integer>(); // Elements to be deleted
for(int i : list) { // ConcurrentModificationException
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
int n = iterator.next();
if(n % i == 0) {
del.add(n);
}
}
}
list.removeALL(del);
ArrayList list=new ArrayList();//向其中添加一些值
ArrayList del=新建ArrayList();//要删除的元素
对于(int i:list){//ConcurrentModificationException
迭代器迭代器=list.Iterator();
while(iterator.hasNext()){
int n=迭代器.next();
如果(n%i==0){
del.add(n);
}
}
}
列表。删除所有(del);
我没有尝试过,但可以使用:
List<Integer> list = new ArrayList<Integer>();
// add some values to it
for(Iterator<Integer> iterator1 = list.iterator(); iterator1.hasNext();) {
int i = iterator1.next();
for(Iterator<Integer> iterator2 = list.iterator(); iterator2.hasNext();){
int n = iterator.next();
if(n % i == 0) {
iterator2.remove();
}
}
}
List List=new ArrayList();
//给它添加一些值
对于(迭代器迭代器1=list.Iterator();迭代器1.hasNext();){
int i=iterator1.next();
for(迭代器迭代器2=list.Iterator();迭代器2.hasNext();){
int n=迭代器.next();
如果(n%i==0){
迭代器2.remove();
}
}
}
或者,如果仍然抛出ConcurrentModificationException(我不确定如果使用同一列表支持的2个迭代器会发生什么),那么使用:
List<Integer> list = new ArrayList<Integer>();
// add some values to it
for(int i : new ArrayList(list)){ // copy list
...
}
List List=new ArrayList();
//给它添加一些值
对于(inti:newarraylist(list)){//复制列表
...
}
foreach
java语法隐藏迭代器,但在隐藏迭代器时,无法在此迭代器上调用remove
方法
因此,我会:
ArrayList<Integer> list = new ArrayList<Integer>(); // add some values to it
int count = 0;
for(Iterator<Integer> it = list.iterator();it.hasNext();count++){ //increments count++
Integer currentInt = it.next();
if(currentInt % count == 0){
it.remove();
}
}
ArrayList list=new ArrayList();//向其中添加一些值
整数计数=0;
for(Iterator it=list.Iterator();it.hasNext();count++){//递增count++
整数currentInt=it.next();
如果(currentInt%count==0){
it.remove();
}
}
您可以看到,在不需要辅助迭代器的情况下实现了相同的功能
您不能在同一时间遍历同一列表。
总之,modcount
变量用于在每次并行更改或迭代列表时检测自身的意外更改。
从而导致ConcurrentModificationException
。
它经常出现在多线程环境中,开发人员必须意识到这一点
此外,更喜欢使用for
循环,而不是,
循环来迭代集合
为什么?
因为使用while
方式,循环后迭代器对象仍在作用域中,而使用for
则不会。对it.next()
的简单确认调用将以无切理异常
结束
最好的做法是保持;)使外部迭代在列表的副本上迭代
for (int i : new ArrayList<>(list)) {
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
int n = iterator.next();
if (n % i == 0) {
iterator.remove();
}
}
}
for(inti:newarraylist(list)){
迭代器迭代器=list.Iterator();
while(iterator.hasNext()){
int n=迭代器.next();
如果(n%i==0){
iterator.remove();
}
}
}
非常感谢对问题标题的任何建议。问题是我需要使用列表中的数字进行比较。因此,ai=1;i++
不会这样做,因为数字不是1,2,3等。您使用迭代器获取列表中的数字,那么为什么需要循环?我正在学习Java,但迭代器不会迭代项(在本例中为列表)的值吗?我需要对每个列表值进行循环,这迫使我使用嵌套循环。这是否意味着列表中的每个项都是另一个列表还是什么?错误。。。这不应该是del.add(n)
?这就是我要寻找的,但是,我需要在while循环完成后立即执行元素删除,也就是说,在每个for循环结束时。@Zar您也可以这样做。只需将del
列表声明移动到循环中,并在每次迭代后删除。第一个解决方案仍然存在ConcurrentModificationException:-(