zoukankan      html  css  js  c++  java
  • list的remove方法

    list有两个remove方法;

    E remove(int index);//根据索引删除

    boolean remove(Object o);//根据对象删除

    List<String> list = new ArrayList<String>();
    String a = "1";
    String b = "2";
    String c = "2";
    String d = "1";
    String e = "1";
    String f = "1";

    list.add(a);
    list.add(b);
    list.add(c);
    list.add(d);
    list.add(e);
    list.add(f);
    List<String> ss = new ArrayList<String>();
    for (int j = 0; j < list.size(); j++) {
      if (list.get(j).equals("2")) {
        // list.remove(j);
        list.remove(list.get(j));
      }
      //System.out.println("list大小 " + list.size() + ",此时j的值: " + j + ",此时集合的值:" + list.toString());
    }
    System.out.println(list.toString());

    两个方法都会输出

    [1, 2, 1, 1, 1]

    这里面有个坑就是两个remove方法在删除了某个元素以后,集合里剩下的元素都会往前移动,所以在第一次删除b元素时,j等于1,在删除b元素后,b元素之后的元素全都向前移动,这时候集合的元素为1 2 1 1 1 ,但是j已经等于1了,所以下一次循环j等于2时已经把c元素给跳过了。

    所以想要得到正确结果 [1, 1, 1, 1]

    解决办法:

    1.将循环结构改成从最后一个元素开始遍历

    for (int j = list.size() - 1; j >= 0; j--) {
      if (list.get(j).equals("2")) {
        // list.remove(j);
        list.remove(list.get(j));
      }
    }

    2.使用迭代器

    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
      String x = it.next();
      if (x.equals("2")) {
        it.remove();
      }
    }
    System.out.println(list.toString());

  • 相关阅读:
    CRM
    eclipse 全局替换
    ps 泡泡
    SSH重新登录的问题
    又说oracle spatial 将Geometry转为gml
    其实你可以这样折腾java enum
    Sqlite 多线程入库
    Oracle spatial 将Geometry转换为gml字符串
    Oracle 关于WKT构造SDO_GEOMETRY的问题。
    Lucene之拉框查询
  • 原文地址:https://www.cnblogs.com/zhengbiyu/p/9240093.html
Copyright © 2011-2022 走看看