zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    重构:以Java POI 导出EXCEL为例
    从源码角度看LinkedList一些基本操作(jdk1.7)
    OpenCV学习笔记(1)
    尝试实现手势控制计算机(持续跟进)
    神经网络学习笔记三——梯度检验、高级优化
    神经网络学习笔记二——反向传导
    神经网络学习笔记一——Neural Network
    C++ 指针和引用 吐血整理 Pointer&Reference
    BST 解析 (二)height and deletion
    BST 解析 (一)
  • 原文地址:https://www.cnblogs.com/cmblogs/p/4414548.html
Copyright © 2011-2022 走看看