关于list集合的remove和Iterator的remove

在java中对list进行操作很频繁,特别是进行list启遍历,这些操作我们都会,也很熟悉,但是对java中list进行删除元素,remove list中的元素就不怎么熟悉了吧,可以说很陌生,是实际操作中也很容易出错,先看看下面这个java中如何remove list 中的元素吧.

  1. public class test {  
  2. public static void main(String[] args) {  
  3.     String str1 = new String("abcde");  
  4.     String str2 = new String("abcde");  
  5.     String str3 = new String("abcde");  
  6.     String str4 = new String("abcde");  
  7.     String str5 = new String("abcde");  
  8.     List list = new ArrayList();  
  9.   
  10.     list.add(str1);  
  11.     list.add(str2);  
  12.     list.add(str3);  
  13.     list.add(str4);  
  14.     list.add(str5);  
  15.   
  16.     System.out.println("list.size()=" + list.size());  
  17.     for (int i = 0; i < list.size(); i++) {  
  18.         if (((String) list.get(i)).startsWith("abcde")) {  
  19.             list.remove(i);  
  20.         }  
  21.     }  
  22.     System.out.println("after remove:list.size()=" + list.size());  
  23.     }  
  24. }  
public class test {
public static void main(String[] args) {
	String str1 = new String("abcde");
	String str2 = new String("abcde");
	String str3 = new String("abcde");
	String str4 = new String("abcde");
	String str5 = new String("abcde");
	List list = new ArrayList();

	list.add(str1);
	list.add(str2);
	list.add(str3);
	list.add(str4);
	list.add(str5);

	System.out.println("list.size()=" + list.size());
	for (int i = 0; i < list.size(); i++) {
		if (((String) list.get(i)).startsWith("abcde")) {
			list.remove(i);
		}
	}
	System.out.println("after remove:list.size()=" + list.size());
    }
}

大家觉得这个程序打印出来的结果是多少呢?
Java代码
运行结果不是:

list.size()=5

after remove:list.size()=0
而是:
Java代码
list.size()=5

after remove:list.size()=2
这是怎么回事呢?到底要如何remove list 中的元素呢?


原因:List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。


怎么解决?有三种方法可以解决这个问题:

1.倒过来遍历list

  1. for (int i = list.size()-1; i > =0; i--) {  
  2.   if (((String) list.get(i)).startsWith("abcde")) {  
  3.    list.remove(i);  
  4.   }  
  5. }  
for (int i = list.size()-1; i > =0; i--) {
  if (((String) list.get(i)).startsWith("abcde")) {
   list.remove(i);
  }
}

2.每移除一个元素以后再把i移回来(不建议,容易搞混)

  1. for (int i = 0; i < list.size(); i++) {  
  2.   if (((String) list.get(i)).startsWith("abcde")) {  
  3.    list.remove(i);  
  4.    i=i-1;  
  5.   }  
  6. }  
for (int i = 0; i < list.size(); i++) {
  if (((String) list.get(i)).startsWith("abcde")) {
   list.remove(i);
   i=i-1;
  }
}

3.使用iterator.remove()方法删除(推荐)

  1. for (Iterator it = list.iterator(); it.hasNext();) {  
  2.   String str = (String)it.next();  
  3.   if (str.equals("chengang")){  
  4.    it.remove();  
  5.   }  
  6. }  

Iterator接口的remove方法将会删除上次调用next方法时返回的元素,如果想要删除指定位置上的元素,需要越过这个元素

  1. Iterator it= c.iterator();  
  2. it.next()//skip over the first element  
  3. it.remove();//now remove it  
Iterator it= c.iterator();
it.next()//skip over the first element
it.remove();//now remove it

next方法和remove方法是相互依赖的,如果调用remove之前没有调用next将是不合法的,如果这样做,将会抛出一个IllegalStateException异常。

如果想删除两个相邻的元素,不能直接地这样调用

  1. it.remove();  
  2. it.remove();//error  
it.remove();
it.remove();//error

想要删除一个元素,必须先跳过该元素。



  1. List<Integer> list = new ArrayList<Integer>();  
  2.         for(int i =1;i<10;i++){  
  3.             list.add(i);  
  4.         }  
  5.         Iterator it = list.iterator();  
  6.         while(it.hasNext()){  
  7.             //System.out.println(it.next());  
  8.             it.remove();  
  9.         }  
List<Integer> list = new ArrayList<Integer>();
		for(int i =1;i<10;i++){
			list.add(i);
		}
		Iterator it = list.iterator();
		while(it.hasNext()){
			//System.out.println(it.next());
			it.remove();
		}

此时抛异常,在remove面前加上next方法,就ok了。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Java中,Iterator是一种用于遍历集合类(例如List、Set、Map)中元素的接口。其中,remove()方法是Iterator接口中的一个方法,用于从集合中删除上一次调用next()方法返回的元素。 具体来说,当我们使用Iterator遍历集合时,每次调用next()方法会返回集合中的下一个元素。如果我们想要删除某个元素,可以在调用next()方法后立即调用remove()方法,从而删除上一次返回的元素。需要注意的是,如果在调用next()方法之前或调用remove()方法之后调用remove()方法,都会抛出IllegalStateException异常。 下面是一个简单的例子,演示了如何使用Iteratorremove()方法删除集合中的元素: ```java List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("orange"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String fruit = iterator.next(); if (fruit.equals("banana")) { iterator.remove(); // 删除上一次返回的元素 } } System.out.println(list); // 输出 [apple, orange] ``` 在上面的例子中,我们创建了一个包含三个水果的List集合,并使用Iterator遍历该集合。当我们遍历到“banana”时,调用remove()方法将其从集合中删除。最后,我们输出修改后的集合,可以看到“banana”已经被删除了。 需要注意的是,Iteratorremove()方法只能删除集合中的元素,不能用于添加或修改元素。如果我们想要添加或修改元素,应该使用集合类提供的相应方法(例如List的add()、set()方法)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值