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 动态增/减集合元素的更多相关文章

  1. Java使用foreach遍历集合元素

    Java使用foreach遍历集合元素 1.实例源码 /** * @Title:ForEach.java * @Package:com.you.model * @Description:使用forea ...

  2. 恕我直言你可能真的不会java第10篇-集合元素归约

    Stream API为我们提供了Stream.reduce用来实现集合元素的归约.reduce函数有三个参数: Identity标识:一个元素,它是归约操作的初始值,如果流为空,则为默认结果. Acc ...

  3. java 自增/减运算符

    注意:python中没有 一.自增运算符 1.单独使用时,目的获取变量的值,前++和后++没有区别,使用后值都会递增一. 2.混合使用时,才有区别.前++,先加后用.后++,先用后加 二.自减运算符 ...

  4. Java依据集合元素的属性,集合相减

    两种方法:1.集合相减可以使用阿帕奇的一个ListUtils.subtract(list1,list2)方法,这种方法实现必须重写集合中对象的属性的hashCode和equals方法,集合相减判断的会 ...

  5. java数组集合元素的查找

    java数组和集合的元素查找类似,下面以集合为例. 数组集合元素查找分为两类: 基本查找: 二分折半查找: 基本查找: 两种方式都是for循环来判断,一种通过索引值来判断,一种通过数组索引判断. 索引 ...

  6. 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重

    Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不 ...

  7. Java集合——遍历集合元素并修改

    Java集合——遍历集合元素并修改 摘要:本文主要总结了遍历集合的方式,以及在遍历时修改集合要注意的问题. 遍历Collection 对List和Set的遍历,有四种方式,下面以ArrayList为例 ...

  8. Java修炼——ArrayList常用的方法以及三种方式遍历集合元素。

    List接口ArrayList用法详解 ArrayList常用方法: 1. List.add():添加的方法(可以添加字符串,常量,以及对象) List list=new ArrayList(); l ...

  9. java 数据类型:集合接口Collection之常用ArrayList;lambda表达式遍历;iterator遍历;forEachRemaining遍历;增强for遍历;removeIf批量操作集合元素(Predicate);

    java.util.Collection接口 Java的集合主要由两个接口派生出来,一个是Collection一个是Map,本章只记录Collection常用集合 集合只能存储引用类型数据,不能存储基 ...

随机推荐

  1. 去除菜单项的加速键--‘&’符号

    去除菜单项的加速键--‘&’符号 ---------PopupMenu的AutoHotKeys(不用设置每个Item的这个属性)设置为maManual就行了

  2. centos7安装gcc7.2.0

    1.有时候安装某些工具时,会提示gcc版本过低,需要安装更高版本. 进入/usr/src目录 cd usr/src 2.下载gcc7.2.0 wget 'http://mirrors-usa.go-p ...

  3. 在dotnetcore的MVC项目中,创建支持 vue.js 的最小工程模板

    网上Vue模板不是最新的,我自己做了一个最新的支持 Vue.js 的最小工程模板,方便大家从 Hello world. 入门, 在 VS2017 里学习,并扩展出自己的项目. 下面是创建步骤: 1.在 ...

  4. 第三方jar包上传私服和项目使用

    下面只做个人日志记录,勿喜勿喷 使用两个浏览器,带着下面的问题去看:https://www.cnblogs.com/tyhj-zxp/p/7605879.html.就会清晰了 1.下载和安装nexus ...

  5. Linux 启动时profile、bashrc、~/.bash_profile、~/.bashrc、~/.bash_profile执行顺序以及文件说明

    Linux 启动时profile.bashrc.~/.bash_profile.~/.bashrc.~/.bash_profile执行顺序以及文件说明 一.执行顺序 登录linux时,/etc/pro ...

  6. Derivative of Softmax Loss Function

    Derivative of Softmax Loss Function A softmax classifier: \[ p_j = \frac{\exp{o_j}}{\sum_{k}\exp{o_k ...

  7. 智能化脚本autoit v3的简单了解

    AutoIt v3 是一个类似 BASIC 脚本语言的免费软件, 它设计用于 Windows GUI(图形用户界面) 中进行自动化操作. 利用模拟键盘按键, 鼠标移动和窗口/控件的操作实现自动化任务. ...

  8. logstash filter geoip 转换IP为详细地址等内容。

    使用logstash geoip筛选器可以将ip地址解析为更丰富的内容. 结果类似于这样: "geoip": { "city_name": "Ürüm ...

  9. plsql连接oracle

    在plsql中:   需要在工具----选项    指定 1. orcacle   主目录    :G:\PLSQL Developer 11.0.0.1762 中文绿色注册版(免Oracle11g客 ...

  10. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...