一、ArrayList删除正确姿势概述
先贴测试代码,以后再来总结
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113package com.wxw.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.function.Predicate; /** * ArrayList的删除 坑 * * @Author: wxw * @create: 2020-07-14-22:53 */ public class ArrayList_Delete { public static void main(String[] args) { // 谓词 函数式接口 Predicate<String> predicate = p -> p.equals("a") || p.equals("b"); //1. 普通for循环倒序删除 可以正常删除 结果正确 deleteByReverseOrder(getList(), predicate); //2. 迭代器循环,使用迭代器的remove()方法删除 可以正常删除结果正确 deleteByIterator(getList(), predicate); //3.普通for循环正序删除 可以删除 结果不正确 deleteByOrder(getList(), predicate); //4. 迭代器循环,使用ArrayList的remove()方法删除 报错java.util.ConcurrentModificationException deleteByArrayList(getList(), predicate); //5.java8 forEach方法删除 删除报错java.util.ConcurrentModificationException deleteByForeach(getList(), predicate); // 增强for循环删除 for-each()不能删除 报错 java.util.ConcurrentModificationException deleteByEnhancedForLoop(getList(), predicate); // 正常删除数据 deleteAll(getList(), predicate); } // 调用批量删除方法 private static void deleteAll(List<String> list, Predicate<String> predicate) { List<String> removeList = new ArrayList<>(); for (String string : list) { if (predicate.test(string)) { removeList.add(string); } } list.removeAll(removeList); System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString()); } // 增强for循环删除 for-each()不能删除 报错 java.util.ConcurrentModificationException private static void deleteByEnhancedForLoop(List<String> list, Predicate<String> predicate) { for (String string : list) { if (predicate.test(string)) { list.remove(string); } } } private static void deleteByForeach(List<String> list, Predicate<String> predicate) { list.forEach(p -> { if (predicate.test(p)) { list.remove(p); } }); System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString()); } /** * 迭代器循环,使用ArrayList的remove()方法删除 可以删除 结果不正确 */ private static void deleteByArrayList(List<String> list, Predicate<String> predicate) { Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { if (predicate.test(iterator.next())) { list.remove(iterator.next()); } } System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString()); } private static void deleteByReverseOrder(List<String> list, Predicate<String> predicate) { for (int i = list.size() - 1; i >= 0; i--) { if (predicate.test(list.get(i))) { list.remove(list.get(i)); } } System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString()); } /** * 普通for循环正序删除 可以删除 结果不正确 */ private static void deleteByOrder(List<String> list, Predicate<String> predicate) { for (int i = 0; i < list.size(); i++) { if (predicate.test(list.get(i))) { list.remove(list.get(i)); } } System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString()); } /** * 迭代器循环,使用迭代器的remove()方法删除 结果正确 */ private static void deleteByIterator(List<String> list, Predicate<String> predicate) { Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { if (predicate.test(iterator.next())) { iterator.remove(); } } System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName() + ":" + list.toString()); } public static List<String> getList() { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); return list; } }
(1) List 元素去重
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("redis"); list.add("rediss"); list.add("redis"); list.add("java"); list.add("redis"); list.add("c++"); list.add("redi"); list.add("redi"); list.add("redis"); list.add("java"); list.add("html"); list.add("aa"); list.add("c++"); // 方式一:使用HashSet删除ArrayList中重复的元素(元素顺序改变) HashSet<String> hashSet = new HashSet<String>(list); System.out.println(hashSet); // 方式二:使用LinkedHashSet删除ArrayList中重复的元素(元素顺序不变) HashSet<String> linkedHashSet = new LinkedHashSet<String>(list); System.out.println(linkedHashSet); // 方式三:创建一个新集合,遍历旧的集合,不包含就添加 ArrayList<String> newList = new ArrayList<String>(); Iterator<String> it = list.iterator(); while (it.hasNext()) { String obj = it.next(); if (!newList.contains(obj)) { newList.add(obj); } } System.out.println(newList); // 方式四:用equals方法比较ArrayList中数据,遍历两次List即可 for (int i = 0; i < list.size(); i++) { for (int j = 1 + i; j < list.size(); j++) { if (list.get(i).toString().equals(list.get(j))) { list.remove(j); } } } System.out.println(list); }
相关文章
-
ArrayList的删除姿势你都掌握了吗
-
ArrayList去除重复元素
最后
以上就是激昂樱桃最近收集整理的关于【Java基础知识】ArrayList怎么正确删除元素的全部内容,更多相关【Java基础知识】ArrayList怎么正确删除元素内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复