博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正确遍历删除List中的元素方法(推荐)
阅读量:4624 次
发布时间:2019-06-09

本文共 4139 字,大约阅读时间需要 13 分钟。

遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题。下面主要看看以下几种遍历删除List中元素的形式:

1.通过增强的for循环删除符合条件的多个元素

2.通过增强的for循环删除符合条件的一个元素

3.通过普通的for删除删除符合条件的多个元素

4.通过Iterator进行遍历删除符合条件的多个元素

1
2
3
4
5
6
7
8
9
10
11
/**
   
* 使用增强的for循环
   
* 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException
   
*/
  
public
void
listRemove() {
    
List<Student> students =
this
.getStudents();
    
for
(Student stu : students) {
      
if
(stu.getId() ==
2
)
        
students.remove(stu);
    
}
  
}
1
2
3
4
5
6
7
8
9
10
11
12
/**
   
* 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常
   
*/
  
public
void
listRemoveBreak() {
    
List<Student> students =
this
.getStudents();
    
for
(Student stu : students) {
      
if
(stu.getId() ==
2
) {
        
students.remove(stu);
        
break
;
      
}
    
}
  
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
   
* 这种遍历有可能会遗漏某个元素,因为删除元素后List的size在
   
* 变化,元素的索引也在变化,比如你循环到第2个元素的时候你把它删了,
   
* 接下来你去访问第3个元素,实际上访问到的是原先的第4个元素。当访问的元素
   
* 索引超过了当前的List的size后还会出现数组越界的异常,当然这里不会出现这种异常,
   
* 因为这里每遍历一次都重新拿了一次当前List的size。
   
*/
  
public
void
listRemove2() {
    
List<Student> students =
this
.getStudents();
    
for
(
int
i=
0
; i<students.size(); i++) {
      
if
(students.get(i).getId()%
3
==
0
) {
        
Student student = students.get(i);
        
students.remove(student);
      
}
    
}
  
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
   
* 使用Iterator的方式也可以顺利删除和遍历
   
*/
  
public
void
iteratorRemove() {
    
List<Student> students =
this
.getStudents();
    
System.out.println(students);
    
Iterator<Student> stuIter = students.iterator();
    
while
(stuIter.hasNext()) {
      
Student student = stuIter.next();
      
if
(student.getId() %
2
==
0
)
//这里要使用Iterator的remove方法移除当前对象,如果使用List的remove方法,则同样会出现ConcurrentModificationException
        
stuIter.remove();
    
}
    
System.out.println(students);
  
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import
java.util.ArrayList;
import
java.util.Iterator;
import
java.util.List;
 
public
class
ListRemove {
 
  
public
static
void
main(String args[]) {
    
ListRemove lr =
new
ListRemove();
    
lr.listRemove();
    
lr.listRemoveBreak();
//    lr.listRemove2();
//    lr.iteratorRemove();
  
}
 
  
/**
   
* 使用增强的for循环
   
* 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException
   
*/
  
public
void
listRemove() {
    
List<Student> students =
this
.getStudents();
    
for
(Student stu : students) {
      
if
(stu.getId() ==
2
)
        
students.remove(stu);
    
}
  
}
   
  
/**
   
* 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常
   
*/
  
public
void
listRemoveBreak() {
    
List<Student> students =
this
.getStudents();
    
for
(Student stu : students) {
      
if
(stu.getId() ==
2
) {
        
students.remove(stu);
        
break
;
      
}
    
}
  
}
   
  
/**
   
* 这种不使用增强的for循环,每次重新获取list的size遍历的情况运行时不会报错,但是可能删除的结果是错的。
   
*/
  
public
void
listRemove2() {
    
List<Student> students =
this
.getStudents();
    
for
(
int
i=
0
; i<students.size(); i++) {
      
if
(students.get(i).getId()%
2
==
0
)
        
students.remove(i);
    
}
  
}
   
  
/**
   
* 使用Iterator的方式也可以顺利删除和遍历
   
*/
  
public
void
iteratorRemove() {
    
List<Student> students =
this
.getStudents();
    
System.out.println(students);
    
Iterator<Student> stuIter = students.iterator();
    
while
(stuIter.hasNext()) {
      
Student student = stuIter.next();
      
if
(student.getId() %
2
==
0
)
        
stuIter.remove();
    
}
    
System.out.println(students);
  
}
   
  
private
List<Student> getStudents() {
    
List<Student> students =
new
ArrayList<Student>() {
      
{
        
int
i =
0
;
        
while
(i++ <
10
) {
          
Student student =
new
Student(i,
"201200"
+ i,
"name_"
+ i);
          
this
.add(student);
        
}
      
}
    
};
    
return
students;
  
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public
class
Student {
 
  
private
int
id;
  
private
String stuNo;
  
private
String name;
   
  
public
Student() {
     
  
}
   
  
public
Student(
int
id, String stuNo, String name) {
    
this
.id = id;
    
this
.stuNo = stuNo;
    
this
.name = name;
  
}
 
  
public
int
getId() {
    
return
id;
  
}
 
  
public
void
setId(
int
id) {
    
this
.id = id;
  
}
 
  
public
String getStuNo() {
    
return
stuNo;
  
}
 
  
public
void
setStuNo(String stuNo) {
    
this
.stuNo = stuNo;
  
}
 
  
public
String getName() {
    
return
name;
  
}
 
  
public
void
setName(String name) {
    
this
.name = name;
  
}
 
  
@Override
  
public
String toString() {
    
return
"Student [id="
+ id +
", name="
+ name +
", stuNo="
+ stuNo
        
+
"]"
;
  
}
   
}

转载于:https://www.cnblogs.com/ceshi2016/p/6277121.html

你可能感兴趣的文章
CSS3.0:透明度 Opacity
查看>>
Arduino Wire.h(IIC/ I2C)语法
查看>>
web高并发的解决方案
查看>>
OC中的NSNumber、NSArray、NSString的常用方法
查看>>
android 用ImageSwitcher+Gallery实现图片浏览效果 分类: ...
查看>>
STM32里面的一些小函数——assert_param,PUTCHAR_PROTOTYPE
查看>>
Java分布式锁的三种实现方案(redis)
查看>>
运行客户端程序报读取配置文件出错的解决方案
查看>>
day 5 - 2 字典(dict)练习
查看>>
微引擎的自定义菜单40063错误解决
查看>>
JAVA wait(), notify(),sleep具体解释
查看>>
数据挖掘十大经典算法
查看>>
WebService原理
查看>>
【Unity 3D】学习笔记三十七:物理引擎——碰撞与休眠
查看>>
js动态删除div元素
查看>>
计算机网络中的TCP/IP模型
查看>>
spring mvc 自定义Handlermapping
查看>>
JS验证密码安全级别
查看>>
Cookie是可以覆盖的,如果重复写入同名的Cookie,那么将会覆盖之前的Cookie。
查看>>
Django Models的数据类型
查看>>