当前位置:网站首页>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个值。
参考连接
边栏推荐
- Flink源码解读(二):JobGraph源码解读
- Flink 解析(七):时间窗口
- 手把手带你做强化学习实验--敲级详细
- DOS function call
- DS18B20数字温度计系统设计
- Von Neumann architecture
- The QT program compiled on CentOS lacks a MySQL driven solution
- TCP的三次握手和四次挥手
- Activiti目录(五)驳回、重新发起、取消流程
- ByteDance open source Gan model compression framework, saving up to 97.8% of computing power - iccv 2021
猜你喜欢
JVM之垃圾回收器下篇
Some feelings of brushing leetcode 300+ questions
Shell_ 07_ Functions and regular expressions
数据传送指令
Shell_ 05_ operator
Coursera cannot play video
Resume of a microservice architecture teacher with 10 years of work experience
Activiti目录(三)部署流程、发起流程
Alibaba cloud server builds SVN version Library
Shell_ 02_ Text three swordsman
随机推荐
8086 分段技术
MySQL string function
@RequestMapping、@GetMapping
Activiti directory (III) deployment process and initiation process
汇编课后作业
@RestController、@Controller
In the command mode in the VI editor, delete the character usage at the current cursor__ Command.
Shell_ 07_ Functions and regular expressions
DOS 功能调用
算数运算指令
After idea installs the plug-in, restart the plug-in and disappear
Idea resolving jar package conflicts
字节跳动春招攻略:学长学姐笔经面经,还有出题人「锦囊」
Interpretation of Flink source code (III): Interpretation of executiongraph source code
ByteDance overseas technical team won the championship again: HD video coding has won the first place in 17 items
手把手带你做强化学习实验--敲级详细
Restful style interface design
Mongodb learning notes
Activiti目录(三)部署流程、发起流程
唯有学C不负众望 TOP3 Demo练习