例一:
想在
list
中删除元素,先看下面的这一段代码:
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
for(int i=0;i<list.size();i++) {
if("bb".equals(list.get(i))) {
list.remove(i);
}
}
for(String s:list) {
System.out.println(s);
}
}
}
运行结果如下所示,看起来没啥问题,再看下面的例子。
例二:
此时,
list
中有多个重复的元素,我们还是用原来的方法进行去重,如下所示:
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
for(int i=0;i<list.size();i++) {
if("bb".equals(list.get(i))) {
list.remove(i);
}
}
for(String s:list) {
System.out.println(s);
}
}
}
运行结果如下所示,貌似出了个小问题,因为有个
bb
并没有去除掉。
原因:
为什么会出现这种问题呢?
当删除第一个
bb
元素后,下一个
元素就会向前移
一
位
, 而for循环的索引是继续往后加1的,即没删除之前
list.get(2)=’bb’
,当删除第一个
“bb”
后,下一个元素前移,导致此时
list.get(1)=’bb’
,
list.get(2)=’cc’
,而
for
循环里面的
i
并没有发生变化,还是继续执行
+1
向后遍历的操作,导致
“bb”
元素逃脱了并没有删除。
解决方式一:
只需要在发生删除元素的时候,将索引里面的
i
向前移位即可,即元素发生前移的同时,也让索引发生前移,即
i–
,如下代码所示:
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
for(int i=0;i<list.size();i++) {
if("bb".equals(list.get(i))) {
list.remove(i);
i--;
}
}
for(String s:list) {
System.out.println(s);
}
}
}
输出结果如下所示:
解决方式二:
使用倒序遍历
list
,如下所示:
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
for(int i=list.size()-1;i>=0;i--) {
if("bb".equals(list.get(i))) {
list.remove(i);
}
}
for(String s:list) {
System.out.println(s);
}
}
}
输出结果如下:
解决方式三:
使用迭代器
Iterator
来进行元素操作(官方推荐),代码如下所示:
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
if("bb".equals(it.next())) {
it.remove();
}
}
for(String s:list) {
System.out.println(s);
}
}
}
输出结果如下所示:
解决方式四:
使用
java8
的
lambda
表达式,使用
lambda
表达式的方法更为优雅,这里使用了
List
接口所继承的
Collection
接口在
JDK 1.8
新增的
removeIf
方法,该方法接收一个
Predicate
类型的参数,删除列表中满足
Predicate
条件的元素。
public class App2 {
public static void main( String[] args ){
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("bb");
list.removeIf(e ->"bb".equals(e));
for(String s:list) {
System.out.println(s);
}
}
}
输出结果如下: