关于集合中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( ...
随机推荐
- NavBarControl 通过代码添加
看到网上很多都是直接在控件上面添加的 而我的是保存在数据库读取后添加的. 后来自己摸索了一下. 通过代码添加 navBarControl1.Groups.Add(new NavBarGroup( st ...
- c# 使用委托子窗体改变父窗体控件
首先创建两个窗体,在窗体1和窗体2放上对应的控件 在窗体1的代码如下 using System; using System.Collections.Generic; using System.Comp ...
- SSH(二)框架配置文件
在引入了宽假所需要的jar包后,引入相应配置文件. 一.Struts2的配置文件: 1.Struts2的黑心过滤器,在web.xml中引入: <!-- struts2框架的核心过滤器 clas ...
- MISC中的图片修改宽高问题
在做CTF中MISC分类题目时,很常见的一个问题就是修改图片正确的宽与高 (此篇笔记中的内容以ctfshow中MISC入门分类为切入点,感兴趣的同学可以一边做一边有不会的看看,仅供参考,我是菜鸡) 曾 ...
- vue项目中配置scss
之前创建 vue 项目的时候没有选择 scss 预编译,现在项目中要使用,不知道如何配置,网上搜了下全都是: npm install sass-loader --save-devnpm instal ...
- Linux基础 文件和目录
文件和目录 前言 本章讨论文件属性和文件系统内容.除了上一章讨论的普通文件,Linux的文件概念还包括:目录.设备等.在Linux系统中,文件的种类包括:普通文件.目录.符号链接.块设备.字符设备.管 ...
- asp+vb.net解决调接口返回中文乱码问题
1.问题描述 涉及语言:vb,vbscript,vb.net,asp 最近在工作中碰到了这样一个问题:需要调用一个接口解析简历文件中的关键信息.直接用postman测试该接口,接口返回值没问题,但一旦 ...
- [R语言] 基于R语言实现树形图的绘制
树状图(或树形图)是一种网络结构.它由一个根节点组成,根节点产生由边或分支连接的多个节点.层次结构的最后一个节点称为叶.本文主要基于R语言实现树形图的绘制.关于python实现树形图的绘制见:基于ma ...
- 如何指定多个项目的 InternalsVisibleTo
InternalsVisibleTo 属性允许你指定一个或多个程序集,这些程序集可以访问当前程序集中的内部类型.经常在进行单元测试时使用,例如,你可以在一个项目中定义一个内部类型,然后在另一个项目中进 ...
- Linux中的infuxdb安装及数据迁移
一.安装influxdb 1.更新yum源 cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo [influxdb] baseu ...