当前位置: 代码网 > it编程>编程语言>Java > Java list移除元素相关操作指南

Java list移除元素相关操作指南

2024年12月26日 Java 我要评论
1.删除指定元素(四种方法)(1)增强for(避免java.util.concurrentmodificationexception异常)//如删除能够整除3的元素arraylist<integ

1.删除指定元素(四种方法)

(1)增强for(避免java.util.concurrentmodificationexception异常)

//如删除能够整除3的元素
arraylist<integer> list = new arraylist<>(arrays.aslist(1, 2, 3, 4, 5,6,7,8,9,10));
//删除前:
system.out.println(list);
for (integer integer : new arraylist<>(list)) {
    if (integer % 3 == 0){
        list.remove(integer);
       }
    }
//删除后:
system.out.println(list);

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]

注意:上述代码中删除元素时,我遍历时创建了集合对象的副本,对副本进行遍历,对原数组进行了删除,这是一种方式,没法直接遍历list并删除,那样会出现以下错误:

d:\java\jdk1.8.0_321\bin\java.exe "-javaagent:d:\softlocation\idea 2019\intellij idea 2019.3.1\lib\idea_rt.jar=51701:d:\softlocation\idea 2019\intellij idea 2019.3.1\bin" -dfile.encoding=utf-8 -classpath 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
exception in thread "main" java.util.concurrentmodificationexception
	at java.util.arraylist$itr.checkforcomodification(arraylist.java:911)
	at java.util.arraylist$itr.next(arraylist.java:861)
	at com.sh.mu.script.logic.system.likou.likoutest.main(likoutest.java:49)

java.util.concurrentmodificationexception 是 java 中的一个运行时异常,它发生在我们试图在单线程的环境下修改一个集合对象的同时,另一个线程也在修改同一个集合对象时。

为了避免这个异常,我们有以下几种解决方案:

1.在单线程环境下,使用 iterator 的 remove() 方法删除元素,而不是直接修改集合对象。

2.在多线程环境下,使用线程安全的集合类,如 concurrenthashmap、copyonwritearraylist 等。

3.在单线程环境下,创建集合对象的副本,对副本进行修改操作。

4.使用 java 8 的 lambda 表达式和流操作,而不是显式使用迭代器。

(2)迭代器

//如删除能够整除3的元素
arraylist<integer> list = new arraylist<>(arrays.aslist(1, 2, 3, 4, 5,6,7,8,9,10));
        //删除前:
system.out.println(list);
iterator<integer> iterator = list.iterator();
while (iterator.hasnext()){
  integer next = iterator.next();
    if (next % 3 ==0){
      iterator.remove();
    }
 }
//删除后:
system.out.println(list);

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]

(3)stream流

//如删除能够整除3的元素
arraylist<integer> list = new arraylist<>(arrays.aslist(1, 2, 3, 4, 5,6,7,8,9,10));
//删除前:
system.out.println(list);
list<integer> integers = list.stream().filter(e -> e % 3 != 0).collect(collectors.tolist());

for (integer integer : new arraylist<>(list)) {
   if (integer % 3 == 0){
      list.remove(integer);
    }
 }
//删除后:
system.out.println(integers);

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]

(4)removeif()

//如删除能够整除3的元素
arraylist<integer> list = new arraylist<>(arrays.aslist(1, 2, 3, 4, 5,6,7,8,9,10));
//删除前:
system.out.println(list);
list.removeif(integer -> integer % 3 == 0);
//删除后:
system.out.println(list);

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]

2.从list2中删除包含list1的元素

(1)for循环

注意遍历和删除不能操作同一数据,避免并发修改带来的问题。

arraylist<integer> list1 = new arraylist<>(arrays.aslist(1,2,3,6));
arraylist<integer> list2 = new arraylist<>(arrays.aslist(1,2,3,1,2,3,4,5));

//删除前
system.out.println("list1元素:" + list1);
system.out.println("list2删除前:" + list2);
for (integer integer : new arraylist<>(list2)) {
    for (integer integer1 : new arraylist<>(list1)) {
        if (objects.equals(integer, integer1)){
            list2.remove(integer1);
        }
    }

结果:

list1元素:[1, 2, 3, 6]
list2删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2删除后:[4, 5]

(2)removeall()

arraylist<integer> list1 = new arraylist<>(arrays.aslist(1,2,3,6));
arraylist<integer> list2 = new arraylist<>(arrays.aslist(1,2,3,1,2,3,4,5));
//删除前
system.out.println("list1元素:" + list1);
system.out.println("list2删除前:" + list2);
list2.removeall(list1);
system.out.println("list2删除后:" + list2);

结果:

list1元素:[1, 2, 3, 6]
list2删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2删除后:[4, 5]

(3)removeif()

arraylist<integer> list1 = new arraylist<>(arrays.aslist(1,2,3,6));
arraylist<integer> list2 = new arraylist<>(arrays.aslist(1,2,3,1,2,3,4,5));
//删除前
system.out.println("list1元素:" + list1);
system.out.println("list2删除前:" + list2);
  list2.removeall(list1);
list2.removeif(list1::contains);
system.out.println("list2删除后:" + list2);

结果:

list1元素:[1, 2, 3, 6]
list2删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2删除后:[4, 5]

(4)stream流

使用java8及以上版本的stream api:首先利用stream()获取流,然后使用filter过滤掉不需要的元素,最后使用collect方法收集结果。

arraylist<integer> list1 = new arraylist<>(arrays.aslist(1,2,3,6));
arraylist<integer> list2 = new arraylist<>(arrays.aslist(1,2,3,1,2,3,4,5));
//删除前
system.out.println("list1元素:" + list1);
system.out.println("list2删除前:" + list2);
list<integer> collect = list2.stream().filter(e -> !list1.contains(e)).collect(collectors.tolist());
system.out.println("list2删除后:" + collect);

结果:

list1元素:[1, 2, 3, 6]
list2删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2删除后:[4, 5]

3.删除指定下标元素

(1)remove(index)方法

这是list接口提供的一个方法,可以直接删除指定下标位置的元素,使用此方法,需要传要删除的元素下标。

arraylist<integer> list = new arraylist<>(arrays.aslist(1,2,3,1,2,3,4,5));
system.out.println("list删除前:" + list);
//删除list下标为1的元素
list.remove(1);
system.out.println("list删除后:" + list);

结果:

list删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list删除后:[1, 3, 1, 2, 3, 4, 5]

(2)sublist(int fromindex,int toindex)方法

如:删除下表1到3的元素:该方法返回源列表的一个子列表,包含从fromindex(包含)到toindex(不包含)之间的所有元素。如果fromindex和toindex相同,则返回一个空的子列表。

arraylist<integer> list = new arraylist<>(arrays.aslist(1,2,3,1,2,3,4,5));
system.out.println("list删除前:" + list);
//删除下标为1到3的元素
list.sublist(1,3).clear();
system.out.println("list删除后:" + list);

结果:

list删除前:[1, 2, 3, 1, 2, 3, 4, 5]
list删除后:[1, 1, 2, 3, 4, 5]

总结

到此这篇关于java list移除元素相关操作指南的文章就介绍到这了,更多相关java list移除元素内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com