[ArrayList删除元素] 你需要了解的ArrayList如何安全的删除重复元素/ list去重
学习笔记使用
ArrayList特点:动态数组结构,元素有序,可重复的一个集合
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");// 方案一:通过for循环for (int i = 0;i<words.size();i++){if ("a".equals(words.get(i))){words.remove(i);}}// 方案二:通过一个迭代器Iterator<String> iterator = words.iterator();while (iterator.hasNext()){String word = iterator.next();if ("e".equals(word)){iterator.remove();}}// 通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
b
c
c
d
上图代码,是for循环和迭代器删除不重复的元素,安全删除元素。
import java.util.ArrayList;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");// 方案一:通过for循环for (int i = 0;i<words.size();i++){if ("c".equals(words.get(i))){words.remove(i);}}// 通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
a
b
c
d
e
上图代码,是for循环删除指定的重复元素, 但是删除不安全,运行结果还有一个C 原因是动态数组结构
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");// 方案二:通过一个迭代器Iterator<String> iterator = words.iterator();while (iterator.hasNext()){String word = iterator.next();if ("c".equals(word)){iterator.remove();}}// 通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
a
b
d
e
上图代码:迭代器删除指定重复元素,安全删除
对比发现,如果使用for循环,在list集合中删除相同的元素会发现删除不干净,而对比使用迭代器可以删除相同的元素。
import java.util.ArrayList;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");// 方案三:使用增强for循环for (String word : words){if ("c".equals(word)){words.remove(word);}}// 通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)at java.util.ArrayList$Itr.next(ArrayList.java:859)at 经典面试题.TestForeach.main(TestForeach.java:40)
上图代码是增强for循环,删除指定的重复元素,但是抛出异常报错,
由图可知:只要modCount != expectedModCount就会抛出异常,那我们只要关心一下两个值为什么不相等,在集合对其进行添加和修改时都会修改modCount值,在遍历之前modCount值是6,一开始modCount 与expectedModCount是相等的,在循环的过程中会删除一个元素,这时modCount与expectedModCount就不相等,因此会抛出异常。
二:下面为 安全删除指定重复元素
import java.util.ArrayList;
import java.util.List;public class TestForeach {public static void main(String[] args) {List<String> words = new ArrayList<>();words.add("a");words.add("b");words.add("c");words.add("c");words.add("d");words.add("e");// 方案四:采用removeIf接口,里面传上一个lambda表达式words.removeIf(word ->word.equals("c"));// 通过流的方式打印输出words.stream().forEach(System.out::println);}
}运行结果:
a
b
d
e
上图为jdk8的优化:
Java安全删除集合元素jdk8的终极解决方案:采用removeIf接口
//倒序删除,以防因为删除中间项导致数据下标变更,使得数据出错public static void remove2(List<String> list) {for (int i = list.size() - 1; i >= 0; i--) {if (list.get(i).contains("3")) {list.remove(i);}}}
顺序list集合删除
// 顺序删除,但是对下标和索引进行了处理public static void remove3(List<String> list) {for (int i = 0, len = list.size(); i < len; i++) {if (list.get(i).contains("3")) {list.remove(i);len--;i--;}}}
总结:
安全删除元素:
顺序,倒序都能删除指定的重复元素,案例在下面的源码里(remove2,remove3方法)
使用普通for循环可以删除不相同元素
可以使用迭代器删除元素
使用jdk8推出的新接口removeIf接口
不安全删除元素:
使用普通for循环删除相同元素会删除不干净
使用增强for循环删除元素会抛出并发修改异常
注意:不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。
地址
package com.numberone.web;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class ArrayListTest {public static void main(String[] args) {ArrayList<String> strs = new ArrayList<>();strs.add("1");strs.add("32");strs.add("3");strs.add("4");strs.add("5");strs.add("36");strs.add("3");strs.add("3");System.out.println("删除元素前"+strs.size());System.out.println("删除元素前"+strs);
// remove1(strs);
// remove9(strs);
// remove2(strs);remove3(strs);
// remove4(strs);System.out.println("删除元素后"+strs);System.out.println("删除元素后"+strs.size());// printList(strs);
//}//使用iterator,这个是java和Android源码中经常使用到的一种方法,所以最为推荐public static void remove1(List<String> list) {Iterator<String> sListIterator = list.iterator();while (sListIterator.hasNext()) {String str = sListIterator.next();if (str.contains("3")) {sListIterator.remove();}}}//不安全public static void remove9(List<String> list){for (int i=0;i<list.size();i++){if (list.get(i).contains("3")) {list.remove(i);}}}//倒序删除,以防因为删除中间项导致数据下标变更,使得数据出错public static void remove2(List<String> list) {for (int i = list.size() - 1; i >= 0; i--) {if (list.get(i).contains("3")) {list.remove(i);}}}// 顺序删除,但是对下标和索引进行了处理public static void remove3(List<String> list) {for (int i = 0, len = list.size(); i < len; i++) {if (list.get(i).contains("3")) {list.remove(i);len--;i--;}}}// 在遍历过程中不直接操作原listpublic static void remove4(List<String> list) {List<String> temp = new ArrayList<>();for (String str : list) {if (str.contains("3")) {temp.add(str);}}list.removeAll(temp);}public static void printList(List<String> list) {for (String str : list) {System.out.println(str);}}
}
contains循环遍历
利用 List 的 contains 方法循环遍历, 重新排序, 只添加一次数据, 避免重复:
package com.jpa.demo.model;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class NumTest {public static void main(String[] args) {ArrayList<String> numbersList = new ArrayList<String>(Arrays.asList("1","1","2","2","66"));//排序 sort在对 int类型排序正常,如果另一种逆序 需要重写他底层一个 compare啥的方法 才能逆序//Collections.sort 在对list 为String类型 数字排序的时候 会出现不准!!对string类型 字母排序是正确, 对int 类型的数字 排序是正确的Collections.sort(numbersList);
System.out.println(removeDuplicate(numbersList));}private static List<String> removeDuplicate(List<String> list) {List<String> result = new ArrayList<String>(list.size());for (String str : list) {if (!result.contains(str)) {result.add(str);}}list.clear();list.addAll(result);return result;}
}
[ArrayList删除元素] 你需要了解的ArrayList如何安全的删除重复元素/ list去重相关推荐
- python添加重复元素_在Python 3.6中添加迭代时重复元素
我正在尝试编写一部分代码,该代码从两个不同的列表中获取元素并进行匹配,如下所示,但是由于某种原因,我一直在输出列表中重复获取元素. def assign_tasks(operators, reques ...
- java arraylist 删除回车符_2种Java删除ArrayList中的重复元素的方法
这篇文章将给出两种从ArrayList中删除重复元素的方法,分别是使用HashSet和LinkedHashSet. ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素, ...
- Java删除ArrayList中的重复元素的2种方法
ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素,重复的元素,并保持元素的插入顺序.在编码时我们经常会遇到那种必须从已建成的ArrayList中删除重复元素的要求.这 ...
- Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历
Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...
- 去除有序数组/链表的重复元素--双指针原地修改
去除有序数组的重复元素–双指针原地修改 文章目录 去除有序数组的重复元素--双指针原地修改 一.题目描述 二.分析 三.代码:数组 四.代码:链表 一.题目描述 二.分析 显然,由于数组已经排序,所以 ...
- [Python] set()函数 创建一个无序不重复元素集
Python set()函数 创建一个无序不重复元素集 功能: set()函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. 语法: class set([it ...
- java中去除数组中重复元素的方法
题目 请设计一个方法,将一个int数组arr中重复的元素去除,并且返回新数组newArr. 解法一 保留重复数字中的第一次出现的元素 首先建立一个与原数组等长的标记数组flag[],它的下标与原数组下 ...
- python 如何从列表中剔除(去除)重复元素?set()
方法1:用内置函数set() 方法2:遍历去除元素 参考文章:python中如何去除列表中重复元素?
- python重复元素判定_20段极简Python代码:这些小技巧你都Get了么
↑↑↑ 点击上方蓝字,关注极客猴 如果你喜欢极客猴,可以把我置顶或星标~ 选自 | towardsdatascience转自 | 机器之心 Python 是机器学习最广泛采用的编程语言,它最重要的优势 ...
- C语言数组中找到第一个重复元素的算法(附完整源码)
C语言数组中找到第一个重复元素的算法 C语言数组中找到第一个重复元素的算法完整源码(定义,实现,main函数测试) C语言数组中找到第一个重复元素的算法完整源码(定义,实现,main函数测试) #in ...
最新文章
- 只要有热情和方法就能学好Linux
- spring中aop设计与实现
- 《几何与代数导引》习题1.38
- ContentProvider再探——Document Provider
- 中国男子足球运动员及男足国家队的评价
- mac安装和卸载mysql_小白自学MySQL笔记(一):Mac环境的安装和启动
- Java GridBagLayout 简单使用
- python爬虫从入门到放弃-python 爬虫《从入门到放弃》
- golang fmt.printf()
- oracle中如何测试,Oracle数据库中如何正确的查看sql
- 《趣谈网络协议》课程学习笔记
- 流程图中的实线_绘制工艺流程图就这么简单(附工艺流程图常见符号)
- 中文分词(上)——获取和Word2Vec模型构建
- VVC/JEM代码学习26:m_pcTrQuant-transformN*N
- Ubuntu磁盘分区
- docker-compose(二):SpringBoot + Docker Compose
- 电机磁链和反电动势系数辨识
- R语言:R2OpenBUGS
- === 和 == 的区别
- 解决安装rpm包依赖关系的烦恼 - yum工具介绍及本地源配置方法
热门文章
- Adobe 系列软件中英文版本的切换
- 发json请求,报415错误。POST http://localhost:8080/ 415
- 统计学(五):几种常见的假设检验
- 基于学习的编码(六):DRNLF
- matlab axis坐标轴相关设置详解
- Python学习之re.compile与findall
- cmd 下登陆ftp及相关操作
- 正则(?=)(?:)
- spark sql 之 collect_set collect_list 后WrappedArray 取值
- 基于VUE-CLI实现待办事项功能