关于集合中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( ...
随机推荐
- ArcEngine 释放对象
释放对象 例如IFeatureCursor,IFeatureClass等 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(myFeatureCursor); ...
- Linux常用软件的安装及Nginx的使用
主要内容: 软件安装方式 上传与下载工具 常用软件的安装--jdk.tomcat.mysql.redis 项目的部署 Nginx的安装 Nginx的功能 静态网站部署 虚拟主机配置及端口绑定 域名绑定 ...
- JavaScript入门⑦-DOM操作大全
JavaScript入门系列目录 JavaScript入门①-基础知识筑基 JavaScript入门②-函数(1)基础{浅出} JavaScript入门③-函数(2)原理{深入}执行上下文 JavaS ...
- kestrel网络编程--开发redis服务器
1 文章目的 本文讲解基于kestrel开发实现了部分redis命令的redis伪服务器的过程,让读者了解kestrel网络编程的完整步骤,其中redis通讯协议需要读者自行查阅,文章里不做具体解析. ...
- MySQL可视化软件(Navicat)部署与使用
目录 一:可视化软件(Navicat) 1.什么是可视化软件? 2.什么是Navicat? 二:部署MySQL(Navicat) 1.Navicat连接本地MySQL 2.连接MySQL,输入密码,在 ...
- Go适合做什么?为何这么多人偏爱Go语言?
Go作为Google2009年推出的语言,其被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言. 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着 ...
- python -m pip install --upgrade pip报No module named pip解决方法
解决方法: 1. python -m ensurepip 2. python -m pip install --upgrade pip 注意:添加pip环境变量 在python安装目录下搜索pip3或 ...
- snprintf拼接字符串
例如编辑一个txt文档,不断将字符输入,最终形成一个长句子.可以看成是字符串的不断拼接.snprintf函数具有这个功能. #include<stdio.h> void main(void ...
- 14、java.sql.SQLException: 无效的列类型: 1111 报错问题解决
转载自 在项目中利用Mybatis做持久化框架,XXXMapper.xml中insert语句做插入时,偶然会遇到一些报错或者说是问题,如下: 一.报错日志: nested exception is o ...
- 德摩根定律的证明 De Morgan's law
De Morgan's Laws Lemma 1: \((\bigcup_n S_n)^c=\bigcap_n S_n^c\) Proof for Lemma 1: \[\because \foral ...