关于list集合的remove和Iterator的remove
程序员文章站
2022-06-10 22:13:45
...
在java中对list进行操作很频繁,特别是进行list启遍历,这些操作我们都会,也很熟悉,但是对java中list进行删除元素,remove list中的元素就不怎么熟悉了吧,可以说很陌生,是实际操作中也很容易出错,先看看下面这个java中如何remove list 中的元素吧.
- 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());
- }
- }
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
- for (int i = list.size()-1; i > =0; i--) {
- if (((String) list.get(i)).startsWith("abcde")) {
- list.remove(i);
- }
- }
for (int i = list.size()-1; i > =0; i--) {
if (((String) list.get(i)).startsWith("abcde")) {
list.remove(i);
}
}
2.每移除一个元素以后再把i移回来(不建议,容易搞混)
- for (int i = 0; i < list.size(); i++) {
- if (((String) list.get(i)).startsWith("abcde")) {
- list.remove(i);
- i=i-1;
- }
- }
for (int i = 0; i < list.size(); i++) {
if (((String) list.get(i)).startsWith("abcde")) {
list.remove(i);
i=i-1;
}
}
3.使用iterator.remove()方法删除(推荐)
- for (Iterator it = list.iterator(); it.hasNext();) {
- String str = (String)it.next();
- if (str.equals("chengang")){
- it.remove();
- }
- }
Iterator接口的remove方法将会删除上次调用next方法时返回的元素,如果想要删除指定位置上的元素,需要越过这个元素
- Iterator it= c.iterator();
- it.next()//skip over the first element
- 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异常。
如果想删除两个相邻的元素,不能直接地这样调用
- it.remove();
- it.remove();//error
it.remove();
it.remove();//error
想要删除一个元素,必须先跳过该元素。
- 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();
- }
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了。
上一篇: 为何汉宣帝早就预言了汉元帝必将乱国
下一篇: 与相亲对象聊不来 该继续还是放弃?
推荐阅读
-
Java list.remove( )方法需要注意的地方
-
老生常谈jquery中detach()和remove()的区别
-
【转载】C#中ArrayList集合类和List集合类的比较
-
关于集合List的源码分析
-
【转载】C#中List集合中Last和LastOrDefault方法的差别
-
Python 删除List元素的三种方法remove、pop、del
-
基于DOM节点删除之empty和remove的区别(详解)
-
集合(11)——C#中List〈string〉和string[]数组之间的相互转换
-
关于java List的remove方法导致的异常java.util.ConcurrentModificationException
-
遍历Set集合remove掉不需要的数据,List不能在遍历的时候remove