当前位置:网站首页>List集合数据移除(List.subList.clear)
List集合数据移除(List.subList.clear)
2022-07-06 09:33:00 【小白说(๑• . •๑)】
List集合数据移除(List.subList.clear)
这两天遇到这么一个问题:一个集合的数据当作参数传入,现在分段
使用这个集合的数据,使用完的数据需要在这个集合中被移除,方便获取第二段的数据。
假设:一个集合的数据长度是11个,现分两段使用这个集合,第一段使用5个数据,第二段使用6个数据,达到分段使用集合的数据。为了能正确的获取到数据,获取完成第一段数据之后,将前五个数据从list集合中移除,然后在获取第二段数据,这样也方便循环。
最开始我是这样做的remove()
,移除数据:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("g");
list.add("k");
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
list.add("g");
list.add("h");
list.add("i");
// 模拟获取第一段前五个数
List<String> oneList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
oneList.add(list.get(i));
list.remove(i);
}
// 模拟获取第二段后6个数
List<String> twoList = new ArrayList<>();
for (int i = 0; i < 6; i++) {
twoList.add(list.get(i));
list.remove(i);
}
}
因为ArrayList是线程不安全的,在循环中这样做很明显不合适,并发情况下很可能会出现问题。
所有我换了另外一种方法,removeAll()
,移除List中的数据:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("g");
list.add("k");
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
list.add("a");
list.add("a");
list.add("a");
// 模拟获取第一段前五个数
List<String> oneList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
oneList.add(list.get(i));
}
list.removeAll(oneList);
// 模拟获取第二段后6个数
List<String> twoList = new ArrayList<>();
for (int i = 0; i < 6; i++) {
twoList.add(list.get(i));
}
list.removeAll(twoList);
}
注意集合中的数据发生了变化,这也是我后来才发现的变化:
list原本有11个数据,取出5个之后应该还剩下6个数据,但是removeAll之后还剩下3个数据,这样肯定是不对的,因为这会让获取第二段数据的时候出现数组下标越界的异常。
后来看源码才发现,removeAll移除的是相同的元素。
查资料发现使用迭代器不会移除重复的元素,不过迭代器移除数据不是我想要的方式,也达不到我想要的效果。
最后发现使用subList()
获取当前集合的子集去移除是靠谱的,并且没有出现上面两种问题。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("g");
list.add("k");
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
list.add("a");
list.add("a");
list.add("a");
// 模拟获取第一段前五个数
List<String> oneList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
oneList.add(list.get(i));
}
// 获取子集清除数据
List<String> subList_1 = list.subList(0, 5);
subList_1.clear();
// 模拟获取第二段后6个数
List<String> twoList = new ArrayList<>();
for (int i = 0; i < 6; i++) {
twoList.add(list.get(i));
}
list.subList(0, 6).clear();
}
在最后要说明一下subList作用和参数:
subList是获取当前集合的子集的方法
参数fromIndex:指定新列表的起始点(包括该点)
参数toIndex:指定新列表的终点(不包括该点)
个人理解为从下标fromIndex开始取值,取toIndex个值。
参考连接
边栏推荐
- 原型链继承
- ByteDance open source Gan model compression framework, saving up to 97.8% of computing power - iccv 2021
- Shell_ 07_ Functions and regular expressions
- 面试集锦库
- Programmer orientation problem solving methodology
- 一个数10年工作经验的微服务架构老师的简历
- Activit fragmented deadly pit
- Shell_ 03_ environment variable
- JVM之垃圾回收器下篇
- Notes on how the network is connected
猜你喜欢
字节跳动春招攻略:学长学姐笔经面经,还有出题人「锦囊」
Assembly language addressing mode
Some feelings of brushing leetcode 300+ questions
Thank you for your invitation. I'm in the work area. I just handed in the code. I'm an intern in the next ByteDance
Flink 解析(七):时间窗口
Assembly language segment definition
arithmetic operation
Activiti目录(五)驳回、重新发起、取消流程
Error occurred during initialization of VM Could not reserve enough space for object heap
吴军三部曲见识(四) 大家智慧
随机推荐
Activiti directory (I) highlights
汇编语言基础知识
When it comes to Google i/o, this is how ByteDance is applied to flutter
@RequestMapping、@GetMapping
Logical operation instruction
MySQL string function
逻辑运算指令
TCP's three handshakes and four waves
吴军三部曲见识(七) 商业的本质
Assembly language addressing mode
姚班智班齐上阵,竞赛高手聚一堂,这是什么神仙编程大赛?
Activiti目录(三)部署流程、发起流程
Fdog series (4): use the QT framework to imitate QQ to realize the login interface, interface chapter.
Eight part essay that everyone likes
The daemon thread starts redis and modifies the configuration file
Set up the flutter environment pit collection
关于Stream和Map的巧用
Alibaba cloud server builds SVN version Library
In the command mode in the VI editor, delete the character usage at the current cursor__ Command.
8086 CPU internal structure