List中移除指定元素

  • Post author:
  • Post category:其他


例一:

想在

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);
		}
	}
}

输出结果如下:



版权声明:本文为xhf852963原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。