精华内容
下载资源
问答
  • list移除
    2021-08-28 17:16:39

    一.迭代器删除

    迭代器 Iterator 是什么?

    Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。

    Iterator 怎么使用?有什么特点?

    Iterator 使用代码如下:

    List<String> list = new ArrayList<>();
        Iterator<String> it = list. iterator();
        while(it. hasNext()){
          String obj = it. next();
          System. out. println(obj);
        }

    Iterator 的特点是只能单向遍历,但是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

    如何边遍历边移除 Collection 中的元素?

    边遍历边修改 Collection 的唯一正确方式是使用 Iterator.remove() 方法,如下:

      Iterator<Integer> it = list.iterator();
        while(it.hasNext()){
           *// do something*
           it.remove();
        }

    一种最常见的错误代码如下:

     for(Integer i : list){
           list.remove(i)
        }

    运行以上错误代码会报 ConcurrentModificationException 异常。这是因为当使用 foreach(for(Integer i : list)) 语句时,会自动生成一个iterator 来遍历该 list,但同时该 list 正在被 Iterator.remove() 修改。Java 一般不允许一个线程在遍历 Collection 时另一个线程修改它。

    二.倒叙遍历删除

    for(int i=list.size()-1; i>-1; i--){
      if(list.get(i).equals("123")){
        list.remove(list.get(i));
      }
    }

    更多相关内容
  • List移除元素

    万次阅读 多人点赞 2019-03-04 16:33:02
    List 移除某个元素 四种方式: 方式一,使用 Iterator ,顺序向下,如果找到元素,则使用 remove 方法进行移除。 方式二,倒序遍历 List ,如果找到元素,则使用 remove 方法进行移除。 方式三,正序遍历 List ,...

    List 移除某个元素

    四种方式:

    • 方式一,使用 Iterator ,顺序向下,如果找到元素,则使用 remove 方法进行移除。
    • 方式二,倒序遍历 List ,如果找到元素,则使用 remove 方法进行移除。
    • 方式三,正序遍历 List ,如果找到元素,则使用 remove 方法进行移除,然后进行索引 “自减”。
    • 方式四,使用jdk1.8新增的Stream流操作
      1.Iterator 迭代器
    	@Test
        public void fun9(){
            List<String> list = new ArrayList<>();
            list.add("赵云");
            list.add("黄忠");
            list.add("马超");
            list.add("关羽");
            list.add("张飞");
            // 获取迭代器
            Iterator<String> it = list.iterator();
            while(it.hasNext()){
                String str = it.next();
                if("关羽".equals(str)){
                    it.remove();
                }
            }
            System.out.println(list);
        }
    

    2.倒序遍历

    	@Test
        public void fun10(){
            List<String> list = new ArrayList<>();
            list.add("赵云");
            list.add("黄忠");
            list.add("马超");
            list.add("关羽");
            list.add("张飞");
            for (int i = list.size() - 1; i > 0; i--) {
                if("关羽".equals(list.get(i))){
                    list.remove(i);
                }
            }
            System.out.println(list);
        }
    

    3.正序遍历

     	@Test
        public void fun11(){
            List<String> list = new ArrayList<>();
            list.add("赵云");
            list.add("黄忠");
            list.add("马超");
            list.add("关羽");
            list.add("张飞");
            for (int i = 0; i < list.size(); i++) {
                if("关羽".equals(list.get(i))){
                    list.remove(i);
                    i--;
                }
            }
            System.out.println(list);
        }
    

    4.Stream流操作(JDK 1.8 +)

    	@Test
        public void fun8(){
            List<String> list = new ArrayList<>();
            list.add("赵云");
            list.add("黄忠");
            list.add("马超");
            list.add("关羽");
            list.add("张飞");
            // 筛选出不是“关羽” 的集合
            list = list.stream().filter(e -> !"关羽".equals(e)).collect(Collectors.toList());
            System.out.println("method4|list=" + list);
    
        }
    

    问题:

    1.为什么不能使用forEach

    	@Test
        public void fun5(){
            List<String> list = new ArrayList<>();
            list.add("赵云");
            list.add("黄忠");
            list.add("马超");
            list.add("关羽");
            list.add("张飞");
            for (String str :list) {
                if ("张飞".equals(str)){
                    list.remove(str);
                }
            }
            System.out.println(list);
        }
    

    在这里插入图片描述
    原因:
             foreach方式遍历元素的时候,是生成iterator,然后使用iterator遍历。在生成iterator的时候,会保存一个expectedModCount参数,这个是生成iterator的时候List中修改元素的次数。如果你在遍历过程中删除元素,List中modCount就会变化,如果这个modCount和exceptedModCount不一致,就会抛出异常。这个是为了安全的考虑。如果使用iterator遍历过程中,使用List修改了元素,可能会出现不正常的现象。如果使用iterator的remove方法则会正常,因为iterator的remove方法会在内部调用List的remove方法,但是会修改excepedModCount的值,因此会正常运行。

    2.为什么forEach 删除倒数第二元素不会出现异常

     	@Test
        public void fun12() {
            List<String> list = new ArrayList<>();
            list.add("赵云");
            list.add("黄忠");
            list.add("马超");
            list.add("关羽");
            list.add("张飞");
            for (String str:list) {
                if("关羽".equals(str)){
                    list.remove(str);
                }
                System.out.println(str);
            }
        }
    

    在这里插入图片描述
    仔细观察发现集合最后一个元素(“张飞”)并没有被遍历出来,因为当我们移除倒数第二个元素(“关羽”)时 cursor(游标)为 4 ,list 中size 属性的值会发生变化(5 - 1 = 4)变为 4,所以下面代码返回 false ,也就不会继续向下遍历。这也是能够正常执行的原因,因为如果继续遍历就会出现问题1 中的情况,在进行checkForComodification() 时,因为 modCount 发生了变化,而expectedModCount 并没有发生变化,所以会出现 ConcurrentModificationException异常。

    public void remove() {
                if (lastRet < 0)
                    throw new IllegalStateException();
                checkForComodification();
    
                try {
                    ArrayList.this.remove(lastRet);
                    cursor = lastRet;
                    lastRet = -1;
                    expectedModCount = modCount;
                } catch (IndexOutOfBoundsException ex) {
                    throw new ConcurrentModificationException();
                }
            }
    
     public boolean hasNext() {
                return cursor != size;
            }
    
    public E next() {
                checkForComodification();
                int i = cursor;
                if (i >= size)
                    throw new NoSuchElementException();
                Object[] elementData = ArrayList.this.elementData;
                if (i >= elementData.length)
                    throw new ConcurrentModificationException();
                cursor = i + 1;
                return (E) elementData[lastRet = i];
            }
    
    final void checkForComodification() {
                if (modCount != expectedModCount)
                    throw new ConcurrentModificationException();
            }
    

    3 普通正序 for 循环为什么要 i –

    因为遍历过程中进行remove 操作时,该位置后面的元素会挤到前面来,这时候会发生一种情况就是原来元素的位置会被他后面的元素取代,而该位置已经遍历过了,所以该元素不会背遍历。 所以要进行 i-- 操作从该位置重新遍历。

    	@Test
        public void fun11(){
            List<String> list = new ArrayList<>();
            list.add("赵云");
            list.add("黄忠");
            list.add("马超");
            list.add("关羽");
            list.add("张飞");
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
                if("关羽".equals(list.get(i))){
                    list.remove(i);
                }
            }
            System.out.println(list);
        }
    

    就是下面的情况 “张飞” 不见了…
    在这里插入图片描述

    4 为什么倒序for 循环可以

    当我们倒序遍历元素的时候,无论删除元素之后的元素怎么移动,之前的元素对应的索引(index)是不会发生变化的,所以在删除元素的时候不会发生问题。

    展开全文
  • list移除null元素 java

    千次阅读 2021-11-11 22:09:47
    list<integer> ls = new ArrayList<integer>(); list.add(1); list.add(2); list.add(null); list.add(3); list.add(null); list.add(4); 如果只需移除第一个null, 那么直接  ls.remove(null); ...
    list<integer> ls = new ArrayList<integer>();
    list.add(1);
    list.add(2);
    list.add(null);
    list.add(3);
    list.add(null);
    list.add(4);

    如果只需移除第一个null, 那么直接

      ls.remove(null);

    如果要全部移除,可以这样

      list<integer> e = new ArrayList<integer>(1);

      e.add(null);

      ls.removeAll(e);

    这样做如果list元素类型不是integer,那么要改为相应类型。这样比较麻烦,可以写成一个Utils,但是还有一个更加简便的方法。

      ls.removeAll(Collections.singleton(null));

    Java 8或更高版本

    Java 8或更高版本,从List列表中删除null的方法非常直观且优雅:

    @Test
    public removeNull() {
        List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));
        list.removeIf(Objects::isNull);
       System.out.println(list)
    
     }

    复制代码

    我们可以简单地使用removeIf()构造来删除所有空值。

    如果我们不想更改现有列表,而是返回一个包含所有非空值的新列表,则可以:

    复制代码

    @Test
    public removeNull() {
     
        List<String> list = new ArrayList<>(Arrays.asList("A", null, "B", null));
     
        List<String> newList = list.stream().filter(Objects::nonNull).collect(Collectors.toList());
       System.out.println(newList)
        System.out.println(list)
    
    }
    展开全文
  • 循环list移除元素-java.lang.UnsupportedOperationException常规for循环(根据list下标删除)foreach循环(根据元素对象删除)迭代器循环删除元素异常分析与解决异常定位解决方案 场景: 在一个codeList列表中移除指定的...

    场景:
    在一个codeList列表中移除指定的元素

    常规for循环(根据list下标删除)

    用for循环, 根据循环cursor来移除在List指定位置的元素

    private boolean removeList(List<String> codeList, String code) {
    	for (int i = 0; i < codeList.size(); i++) {
    		String codeFromList = codeList.get(i);
    		if (StringUtils.equalsAnyIgnoreCase(codeFromList, code)) {
    			codeList.remove(i);
    			return true;
    		}
    	}
    	return false;
    }
    

    foreach循环(根据元素对象删除)

    在foreach循环中, 根据当前对象来删除, 如果有多个则删除第一个(

    remove(object)的实现最终也是通过传入的object取得第一个匹配元素的下标, 所以理论上remove行为直接根据下标删除元素性能更好

    private boolean removeList(List<String> codeList, String code) {
    	for (String codeFromList : codeList) {
    		if (StringUtils.equalsAnyIgnoreCase(codeFromList, code)) {
    			boolean remove = codeList.remove(code);
    			return remove;
    		}
    	}
    	return false;
    }
    

    迭代器循环删除元素

    利用迭代器的能力来删除指定的元素(注意: 不要在另外的线程修改原List)

    private boolean removeList(List<String> codeList, String code) {
    	Iterator<String> iterator = codeList.iterator();
    	if (iterator.hasNext()) {
    		String next = iterator.next();
    		if (StringUtils.equalsAnyIgnoreCase(next, code)) {
    			iterator.remove();
    			return true;
    		}
    	}
    	return false;
    }
    

    异常分析与解决

    异常定位

    我使用发现前面3个方法都报java.lang.UnsupportedOperationException异常…
    原来我的List是使用Arrays.asList()方法构造出来的…
    Arrays.asList()返回的List是个普通的List没有实现remove方法…

    解决方案

    List转成ArrayList即可

    List<String> codeList = new ArrayList<>(Arrays.asList(questionPartEnum.codeList))
    

    ArrayList中实现了remove, 所以可以直接使用了

    展开全文
  • list集合的移除方法

    千次阅读 2021-06-21 16:04:56
    list集合的“移除”详解前言一、返回值类型:有2种1、string:返回删除的元素内容2、boolean类型:表示是否删除成功二、remove详解1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:...
  • c#List移除列表中的元素

    千次阅读 2016-01-26 18:42:00
    对于一个List<T>对象来说移除其中的元素是常用的功能。自己总结了一下,列出自己所知的几种方法。 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 try 6 { 7 ...
  • java list移除null元素

    万次阅读 2016-04-19 22:08:12
    list ls = new ArrayList(); list.add(1); list.add(2); list.add(null); list.add(3); list.add(null); list.add(4); 如果只需移除第一个null, 那么直接ls.remove(null); 如果要全部移除,可以这样 list ...
  • 本文实例分析了C#遍历List并...i<list u5047设当前遍历到D(i=3),移除,接着遍历i u6b64时跳过了E(i=3) 2、我们使用倒序遍历,这个问题就解决了 for(int i=list.Count-1;i>=0;i--) { if(list[i]) { list.Remov
  • Java 移除List中的元素,这玩意讲究!

    千次阅读 多人点赞 2021-01-17 13:47:00
    前阵子,一名java初学者遇到了list 使用remove的问题,当时我暂且给他说了一种解决方案。 事后,我细想, 是不是很多初学者都会碰到这种问题? 虽然阿里开发手册里面有说到这个坑,但是是不是每个人都清楚? 这...
  • java中List元素移除元素的那些坑

    千次阅读 2021-02-26 19:51:34
    参考问题案例1.1、for循环移除public static voidmain(String[] args) {List list = new ArrayList();list.add("11");list.add("11");list.add("12");list.add("13");list.add("14");list.add("15");list.add("16");...
  • Java8 List集合移除满足条件的元素

    千次阅读 2022-02-23 18:29:34
    list.removeIf(filter ->{ return containerList.contains(filter); }); 功能:移除list中已经在containerList 容器中存在的元素。
  • List集合数据移除(List.subList.clear)

    千次阅读 2020-10-21 23:11:52
    List集合数据移除(List.subList.clear) 这两天遇到这么一个问题:一个集合的数据当作参数传入,现在分段使用这个集合的数据,使用完的数据需要在这个集合中被移除,方便获取第二段的数据。 假设:一个集合的数据长度...
  • 本文重点探讨 foreach 循环中移除元素造成java.util.ConcurrentModificationException 异常的原因。 先看《阿里巴巴 Java开发手册》中的相关规定: 那么思考几个问题: 反例的运行结果怎样? 造成这种现象...
  • list的合并: concat var arr1=['a','b','c','d','e'] var arr2=['1','2','3','4','5'] arr1.concat(arr2); // ["a", "b", "c", "d", "e", "1", "2", "3", "4", "5"] list的添加: push var arr1=['a','b','c'...
  • 移除List数组中的某一个元素

    千次阅读 2022-03-21 10:44:11
    近期在开发中遇到了需要移除数组中某一个元素的业务。具体例子如下: 假如有一个数组中有{1,2,3,1,1,4,5,6,1}等元素,如果需要移除掉数组中所有的元素“1”。 如此。首先想到的是循环这个数组。挨个判断挨个移除。...
  • 移除list中为空的元素

    千次阅读 2022-04-14 10:56:44
    在项目中有需求是如果返回的list中的某个元素为空,那么就需要把这个元素移除 循环你的list 判断你的list中的元素是否为空 如果元素为空则移除元素 for (int i = 0; i < list.size(); i++) { //循环你的list ...
  • Java List如何移除不符合条件的数据

    千次阅读 2020-12-21 22:03:30
    1.普通人的第一反应(包括我自己),是for循环整个List,然后在循环体里面进行if条件判断,然后再调用list.remove(obj)方法来移除某个元素。代码示例List list = new ArrayList<>();list.add(1);list.add(2);...
  • jQuery中的removeClass() 方法,移除指定类的确很方便,但是它是jQuery中的方法,原生dom是不能直接使用的。在项目中本来用的jq获取dom,但是在for循环中动态生成div,还要抓取到第i个dom,给div加固定id的话肯定...
  • 移除List集合中特定的元素

    万次阅读 2019-04-15 10:55:19
    1.移除List<String>中指定元素 public static void remove(List<String> list, String target){ for(int i = list.size() - 1; i >= 0; i--){ String item = list.get(i); ...
  • 详解 .NET Core 遍历 List移除

    万次阅读 2019-10-02 12:19:54
    在开发过程中时常会遇到需要遍历集合并移除指定项的场景,我们用不同方法来尝试获得我们希望的结果。 首先声明将要用到的 list 对象。 var list = new List<string>() { "Item1", "Item2", "Item3", "Item3...
  • list集合移除指定元素

    万次阅读 2019-06-14 14:40:17
    定义一个list集合,并添加数据: List<String> list=new ArrayList<>(); list.add("b"); list.add("e") list.add("b"); list.add("c"); 需求:删除该集合中所有字符串为b的数据,代码如下: for...
  • java List集合中元素移除的几种方法整理: /** * @author zly * @date 2020/6/29 10:23 */ public class Test { /** * 集合移除元素实现 */ public static void main(String[] args) { List<String>...
  • } } //错误做法2 这是一旦发生移除元素的操作,就是越界报错 int size = list.size(); for(int i=0;i list2 = list; for(CompanyInfo com : list){ if(companyCodes.contains(com.getCompanyCode)){ list2.remove...
  • Java List移除指定对象

    千次阅读 2019-12-21 07:48:21
    * 移除指定对象 * @param users * @param username */ public static void removeSpecifiedObject(List<User> users, String username) { int size = labels.size(); for (int i = size - 1; i >...
  • 移除list中null元素

    2019-01-23 18:11:00
    查询结果为null, list.size()却是1 移除该null元素 totalList.removeAll(Collections.singleton(null)); 转载于:https://www.cnblogs.com/yadongliang/p/10310600.html
  • 在项目中需要实现一个活动未参与人名单的筛选,一开始使用的list的泛型是String 可以把参与人员在全体的list集合中筛选出来。由于后期需要筛选多个字段,所以把list集合泛型换成了实体所以就无法进行筛选。 原因 ...
  • 众所周知,list在不泛型的情况下是可以存放各种数据类型的,代码如下:public static void main(String[] args) {List list=new ArrayList<>();list.add("我是字符串");list.add(123);list.add(new HashMap<...
  • redis 对list的操作 移除其中单一元素

    千次阅读 2020-07-02 18:09:38
    LPOP:移除并获取链表中的第一个元素。 RPOP:移除并获取链表中最后一个元素。 LTRIM:保留指定区间内的元素。 LLEN:获取链表的长度。 LSET:用索引设置链表元素的值。 LINDEX:通过索引获取链表中的元素。 LRANGE:...
  • JAVA8 移除两个相同的List对象 List<String> userIdList = new ArrayList<>(); List<DtUser> userList = new ArrayList<>(); //无考勤组人员 List<DtUser> resultList = userList....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 369,717
精华内容 147,886
关键字:

list移除