• list如何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. list.add(str1);
    10. list.add(str2);
    11. list.add(str3);
    12. list.add(str4);
    13. list.add(str5);
    14. System.out.println("list.size()=" + list.size());
    15. for (int i = 0; i < list.size(); i++) {
    16. if (((String) list.get(i)).startsWith("abcde")) {
    17. list.remove(i);
    18. }
    19. }
    20. System.out.println("after remove:list.size()=" + list.size());
    21. }
    22. }

    大家觉得这个程序打印出来的结果是多少呢?

    Java代码
    1. 运行结果不是:
    2. list.size()=5
    3. after remove:list.size()=0

    而是:

    Java代码
    1. list.size()=5
    2. after remove:list.size()=2

    这是怎么回事呢?到底要如何remove list 中的元素呢?

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

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

    1.倒过来遍历list

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

    2.每移除一个元素以后再把i移回来

    Java代码
    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. }

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

    Java代码
      1. for (Iterator it = list.iterator(); it.hasNext();) {
      2.   String str = (String)it.next();
      3.   if (str.equals("chengang")){
      4.    it.remove();
      5.   }
      6. }
      7. http://blog.sina.com.cn/s/blog_621b6f0e0100s5n5.html
  • 相关阅读:
    Best Practices for Using Alpha
    Android手机 Fildder真机抓包
    Android调用MediaScanner进行新产生的媒体文件扫描
    读书笔记-----Java并发编程实战(二)对象的共享
    项目经验谈---IM新消息界面刷新异常处理记录
    读书笔记-----Java并发编程实战(一)线程安全性
    OnScroll与OnTouchEvent方法的区别与联系
    View的getLeft, getRight, getTop, getBottom
    如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN
    更改ubuntu mysql data目录位置
  • 原文地址:https://www.cnblogs.com/cmblogs/p/4414548.html
Copyright © 2020-2023  润新知