java 动态增/减集合元素
1. 简介
有时候需要在集合遍历过程中进行增/删,下面介绍几种正确的操作方式。
2. 示例
例如有如下集合[1, 2, 2, 3, 5],需要删除被2整除的元素。
import java.util.*;
public class ListFunc2 {
public static void main(String[] args){
String str = "12235";
String[] arr = str.split("");
List<String> list1 = new ArrayList<>(Arrays.asList(arr));
List<String> list2 = new ArrayList<>(Arrays.asList(arr));
List<String> list3 = new ArrayList<>(Arrays.asList(arr));
List<String> list4 = new ArrayList<>(Arrays.asList(arr));
List<String> list5 = new ArrayList<>(Arrays.asList(arr));
List<String> list6 = new ArrayList<>(Arrays.asList(arr));
System.out.println(list1); // [1,2,2,3,5]
2.1 正序方式
从集合的第一个元素开始遍历:
// 正序方式
for(int i=0; i<list2.size(); i++){
int value = Integer.parseInt(list2.get(i));
if(value%2==0){
list2.remove(i);
}
}
System.out.println(list2); // [1, 2, 3 ,5]
发现未完全删除可以被2整除的元素,原因如下:当i=1时删除第二个元素2,此时后面的元素会前移;然而下次遍历时索引i=2,
对应的元素为3,跳过了原集合中的第三个元素2。
0 3 4 // index
1 2 2 3 5
1 2 5
此时尝试对索引进行修正,将索引重新指向原集合的第三个元素:
for(int i=0; i<list3.size(); i++){
int value = Integer.parseInt(list3.get(i));
if(value%2==0){
list3.remove(i);
i--; // 修正
}
}
System.out.println(list3); // [1, 3, 5]
2.2 逆序方式
从集合的最后一个元素开始向前遍历:
// 逆序方式
for(int i= list4.size()-1; i>=0; i--){
int value = Integer.parseInt(list4.get(i));
if(value%2==0){
list4.remove(i);
}
}
System.out.println(list4); // [1, 3, 5]
索引和集合的对应变化过程如下:
当索引为2时,删除集合中的第三个元素2,此时集合中的后续元素前移;然后索引变为1,删除集合中的第二个元素2;
可以发现,后续元素的前移不会导致索引的跳跃,不影响前面的元素。
0 3 4 // index
1 2 3 5
1 3 5
2.3 Iterator方式
推荐使用Iterator对遍历过程中的集合进行修改,不用担心索引的跳跃和越界情况。
// iterator迭代器
for(Iterator<String> it = list5.iterator(); it.hasNext();){
int value = Integer.parseInt(it.next());
if(value%2==0){
it.remove();
}
}
System.out.println(list5); // [1, 3, 5] Iterator<String> it = list6.iterator();
while(it.hasNext()){
int value = Integer.parseInt(it.next());
if(value%2==0){
it.remove();
}
}
System.out.println(list6); // [1, 3, 5]
2.4 Java 8 新特性
直接使用boolean removeIf(Predicate<? super E> filter)方法
// java 8最新方法
list1.removeIf(v->Integer.parseInt(v)%2==0); // v表示集合中的元素,给出适当条件过滤
System.out.println(list1); // [1, 3, 5]
!!!
java 动态增/减集合元素的更多相关文章
- Java使用foreach遍历集合元素
Java使用foreach遍历集合元素 1.实例源码 /** * @Title:ForEach.java * @Package:com.you.model * @Description:使用forea ...
- 恕我直言你可能真的不会java第10篇-集合元素归约
Stream API为我们提供了Stream.reduce用来实现集合元素的归约.reduce函数有三个参数: Identity标识:一个元素,它是归约操作的初始值,如果流为空,则为默认结果. Acc ...
- java 自增/减运算符
注意:python中没有 一.自增运算符 1.单独使用时,目的获取变量的值,前++和后++没有区别,使用后值都会递增一. 2.混合使用时,才有区别.前++,先加后用.后++,先用后加 二.自减运算符 ...
- Java依据集合元素的属性,集合相减
两种方法:1.集合相减可以使用阿帕奇的一个ListUtils.subtract(list1,list2)方法,这种方法实现必须重写集合中对象的属性的hashCode和equals方法,集合相减判断的会 ...
- java数组集合元素的查找
java数组和集合的元素查找类似,下面以集合为例. 数组集合元素查找分为两类: 基本查找: 二分折半查找: 基本查找: 两种方式都是for循环来判断,一种通过索引值来判断,一种通过数组索引判断. 索引 ...
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不 ...
- Java集合——遍历集合元素并修改
Java集合——遍历集合元素并修改 摘要:本文主要总结了遍历集合的方式,以及在遍历时修改集合要注意的问题. 遍历Collection 对List和Set的遍历,有四种方式,下面以ArrayList为例 ...
- Java修炼——ArrayList常用的方法以及三种方式遍历集合元素。
List接口ArrayList用法详解 ArrayList常用方法: 1. List.add():添加的方法(可以添加字符串,常量,以及对象) List list=new ArrayList(); l ...
- java 数据类型:集合接口Collection之常用ArrayList;lambda表达式遍历;iterator遍历;forEachRemaining遍历;增强for遍历;removeIf批量操作集合元素(Predicate);
java.util.Collection接口 Java的集合主要由两个接口派生出来,一个是Collection一个是Map,本章只记录Collection常用集合 集合只能存储引用类型数据,不能存储基 ...
随机推荐
- 2018-2019-20175205 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告
2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...
- Android的JSON数据解析
一. 使用原生方式解析 准备工作:准备一个布局文件,用来显示元数据与转换之后的数据 <?xml version="1.0" encoding="utf-8" ...
- mask rcnn input数据理解
Array.min() #无参,所有中的最小值 Array.min(0) # axis=0; 每列的最小值 Array.min(1) # axis=1:每行的最小值 字符串在输出时的对齐: S.lju ...
- k8s集群安装
准备三台虚拟机,一台做master,两台做master节点,关闭selinux. 一.安装docker,两node节点上进行 1. 2.安装docker依赖包:yum install -y yum-u ...
- GP数据库 常用SQL语句
GP数据库 常用SQL语句 --1,查看列名以及类型 select upper(column_name) ,data_type from information_schema.columns wher ...
- 换个角度聊聊FaaS
Serverless/FaaS伴随着k8s的热度增加,也成为了热门话题.相关文章介绍了很多,这里笔者不一一赘述,而是从个人见解上聊聊关于FaaS的架构和意义. FaaS可能的架构优化 从AppEngi ...
- VS2110。VC++编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"
有时候我们会在头文件当中定义一些全局变量或者全局函数,这种做法会比较方便,但有时候会出现“编译错误"error LNK2005: 已经在 XXX.obj 中定义的问题"的链接问题. ...
- Spark机器学习基础二
无监督学习 0.K-means from __future__ import print_function from pyspark.ml.clustering import KMeans #from ...
- wireshark基础学习—第一部分wireshark的基础知识
1.Wireshark主窗口 Wireshark的主窗口如下所示 2.每个面板的内容 Packet List(数据包列表): 最上面的面板用表格显示了当前不惑文件中的所有数据包,其中包括了数据包序号. ...
- 本地连接属性:Internet协议版本4(TCP/IPv4)打开闪退解决办法
1.命令窗口配置网络连接指定IP netsh interface ip set address "本地连接" static IP地址 子网掩码 默认网关 例:netsh inter ...