关于集合中remove()方法的问题
首先上一段代码:
needDelete()方法:决定是否要删除
public static boolean needDelete(Object obj) {
if (obj.equals("1"))
return true;
else
return false;
}
方案一运行:
public static void main(String[] args) {`
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("2");
list.add("1");
list.add("1");
list.add("2");
list.add("1");
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
if (needDelete(obj)) //needDelete返回boolean,决定是否要删除
{
it.remove();
}
}
System.out.println(list.toString());
}
此处的输出结果为:[2, 2, 2]
public static void main(String[] args) {
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("2");
list.add("1");
list.add("1");
list.add("2");
list.add("1");
for (int i=0;i<list.size();i++) {
if(needDelete(list.get(i))){
list.remove(i);
}
}
System.out.println(list.toString());
输出结果为:[2, 2, 1, 2]
由此可见:Iterator迭代器( it.remove())能够将集合中全部不想要的数据删除,即数据安全,而简单的用for循环+list.remove(i)却删漏了(即删除不安全)
那么如果我们实在想用for循环又该怎么办呢?
解决方案如下:
for (int i=0;i<list.size();i++) {
if(needDelete(list.get(i))){
list.remove(i);
i--;//加上这一句,就能实现不删漏啦~
}
}
System.out.println(list.toString());[2, 2, 2]
解释:为什么写一个 i-- 就能解决问题呢?这是因为list集合中的ArrayList是一个有序的集合,当我们删除某个元素之后,这个元素后面的元素的下标将会向前推进一个,我们只要能拿到删除后的集合元素的下标也可以实现不漏删。
进一步说明:
现在有这样一个集合: [1,2,3,4,5,6,7]
然后我们删除下标为4的元素得到: [1,2,3,4,6,7]
此时6,7这两个元素的下标发生了变化,下标减小了1
由此我们能够得到:只需要每次移除一个元素后把指定的下标退一(即i--)即可!
关于集合中remove()方法的问题的更多相关文章
- 【转载】C#中List集合使用Remove方法移除指定的对象
在C#的List集合操作中,有时候需要将特定的对象或者元素移除出List集合序列中,此时可使用到List集合的Remove方法,Remove方法的方法签名为bool Remove(T item),it ...
- 使用List中remove方法时需要注意的问题
String str1 = new String("1"); String str2 = new String("2"); String str3 = new ...
- Map集合中的方法
Map集合中的方法: values() 方法 : 获取集合中的所有的值----没有键,没有对应关系, KeySet() 方法: 将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代 ...
- Properties集合中的方法store和Properties集合中的方法load
Properties集合中的方法store public class Demo01Properties { public static void main(String[] args) throws ...
- 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load
package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...
- Properties集合中的方法load-缓冲流的原理
Properties集合中的方法load 参数:InputStream instream:字节输入流,不能读取含有中文的键值对Reader reader:字符输入流,能读取含有中文的键值对使用步骤:1 ...
- 使用ProPerties集合存储数据-Properties集合中的方法store
使用ProPerties集合存储数据 java.util.Properties`继承于Hashtable,来表示一个持久的属性集.它使用键值结构存储数据每个键及其对应值都是一个字符串.该类也被许多Ja ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_3_Properties集合中的方法load
键值对文件,读取到集合中来使用 分隔符也可以用空格 读出来乱码
- 022——VUE中remove()方法的使用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java List集合中contains方法总是返回false
ArrayList的contains方法 java 今天在用ArrayList类的caontains方法是遇到了问题,我写了一个存放User类的ArrayList 但在调用list.contains( ...
随机推荐
- 项目上的业务《接收一个xml信息包进行解析,xml中包含base64解析为电子文件》
我就直接贴代码了,不太会说,附上注释. ps:需要根据系统字段和xml里面的标签字段进行建表,之后把xml标签的值进行添加.创建表的方法就是拼的sql. // 在线接收接口 @Transactiona ...
- Java开发学习(四十三)----MyBatisPlus查询语句之查询投影
1.查询指定字段 目前我们在查询数据的时候,什么都没有做默认就是查询表中所有字段的内容,我们所说的查询投影即不查询所有字段,只查询出指定内容的数据. 具体如何来实现? @SpringBootTest ...
- Linux系统各种库/软件版本输出指令
日常开发基于Linux系统(其实更多的是Ubuntu平台),平时总会遇到一些情况需要查看某个库或者软件的版本信息,在这里做一下简单的记录. 1. 查看glibc版本 方法一:使用ldd指令 cv@cv ...
- nginx配置文件讲解及示例(可复制)
详细的配置说明参考:https://www.cnblogs.com/ghl1024/p/9013805.html [示例一] #运行用户user www-data; #启动进程,通常设置成和cpu ...
- CountDownLatch闭锁源码解析(基于jdk11)
目录 CountDownLatch闭锁源码解析(基于jdk11) 1.1 CountDownLatch概述 1.2 CountDownLatch原理 1.2.1 基本结构(jdk11) 1.2.2 a ...
- Python数据类型+运算符
Python基础数据类型 上期练习讲解 # 练习一.想办法打印出jason l1 = [11, 22, 'kevin', ['tony', 'jerry', [123, 456, 'jason'] ] ...
- Agileboot 1.6.0 发布啦 - 一款致力于规范/精简/可维护 的Springboot + Vue3的快速开发脚手架
平台简介 AgileBoot是一套开源的全栈精简快速开发平台,毫无保留给个人及企业免费使用.本项目的目标是做一款精简可靠,代码风格优良,项目规范的小型开发脚手架. 适合个人开发者的小型项目或者公司内部 ...
- 重学c#系列——linq(1) [二十七]
前言 简单介绍一下linq,linq很多人其实用的很熟练了,但是有些人不知道自己用的是linq. 正文 在介绍linq 之前,先介绍一下集合. public interface ICollection ...
- ABP AutoMapper与自定义Mapping
对象映射 在工作中,需要将相似的对象映射到另一个对象,这样我们来看一个最繁琐的映射方式 例: public class UserAppService : ApplicationService { pr ...
- JVM常用调优参数
目录 JVM内存模型及常用参数 参数解释 垃圾收集器 Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC) Parallel Scavenge收集器(-XX: ...