list如何remove 特别容易出错

java中对list进行操作很频繁,特别是进行list启遍历,这些操作我们都会,也很熟悉,但是对java中list进行删除元素,remove list中的元素就不怎么熟悉了吧,可以说很陌生,是实际操作中也很容易出错,先看看下面这个java中如何remove list 中的元素吧.

  1. public class test {
  2. public static void main(String[] args) {
  3. String str1 = new String("abcde");
  4. String str2 = new String("abcde");
  5. String str3 = new String("abcde");
  6. String str4 = new String("abcde");
  7. String str5 = new String("abcde");
  8. List list = new ArrayList();
  9. list.add(str1);
  10. list.add(str2);
  11. list.add(str3);
  12. list.add(str4);
  13. list.add(str5);
  14. System.out.println("list.size()=" + list.size());
  15. for (int i = 0; i < list.size(); i++) {
  16. if (((String) list.get(i)).startsWith("abcde")) {
  17. list.remove(i);
  18. }
  19. }
  20. System.out.println("after remove:list.size()=" + list.size());
  21. }
  22. }

大家觉得这个程序打印出来的结果是多少呢?

Java代码

  1. 运行结果不是:
  2. list.size()=5
  3. after remove:list.size()=0

而是:

Java代码

  1. list.size()=5
  2. after remove:list.size()=2

这是怎么回事呢?到底要如何remove list 中的元素呢?

原因:List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。

怎么解决?有三种方法可以解决这个问题:

1.倒过来遍历list

Java代码

  1. for (int i = list.size()-1; i > =0; i--) {
  2.   if (((String) list.get(i)).startsWith("abcde")) {
  3.    list.remove(i);
  4.   }
  5. }

2.每移除一个元素以后再把i移回来

Java代码

  1. for (int i = 0; i < list.size(); i++) {
  2.   if (((String) list.get(i)).startsWith("abcde")) {
  3.    list.remove(i);
  4.    i=i-1;
  5.   }
  6. }

3.使用iterator.remove()方法删除

Java代码

    1. for (Iterator it = list.iterator(); it.hasNext();) {
    2.   String str = (String)it.next();
    3.   if (str.equals("chengang")){
    4.    it.remove();
    5.   }
    6. }
    7. http://blog.sina.com.cn/s/blog_621b6f0e0100s5n5.html
时间: 2024-08-30 05:32:57

list如何remove 特别容易出错的相关文章

二分查找总结

最近刷leetcode和lintcode,做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类: 1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置.这种题目继续进阶一下就是在有序数组中查找元素的上下限.继续做可以求两个区间的交集. 2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况. 3.在杨氏矩阵中利用二分查

【南阳OJ分类之语言入门】80题题目+AC代码汇总

声明: 题目部分皆为南阳OJ题目. 代码部分包含AC代码(可能不止一个)和最优代码,大部分都是本人写的,并且大部分为c代码和少部分c++代码and极少java代码,但基本都是c语言知识点,没有太多差别,可能代码有的写的比较丑,毕竟知识有限. 语言入门部分题基本都较为简单,是学习编程入门的很好练习,也是ACM的第一步,入门的最佳方法,望认真对待. 本文由csdn-jtahstu原创,转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:1373758426和csdn博客地址. now begi

【原】配置MySQL服务器端的字符集

[简述] 通过直接配置my.cnf方式修改mysql的字符集,这种方式并不复杂,但是,在linux端配置时,特别容易出错,因此,记录之,以待后用. [配置步骤描述]Step 1:关闭当前的MySQL服务 /etc/init.d/mysqld stop Step 2:修改MySQL的配置参数 在/etc/my.cnf配置文件中,[mysqld]区域之下,添加参数“character-set-server=utf8”. Step 3:重启MySQL服务. /etc/init.d/mysqld sta

20145216史婧瑶《Java 程序设计》第4周学习总结

20145216 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 6.1 何谓继承 继承基本上就是避免多个类间重复定义共同行为. 在Java中,继承时使用extends关键字,private成员也会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(如果父类愿意提供访问方法的话).如: public class SwordsMan extends Role { public void fight() { System.out.println("挥剑

so文件成品评论【整理】

这是我的 @布加迪20 AZ在一篇文章中写道:<汉化so文件的心得>中的技术附件做的简洁性整理.原来的看起来不是非常方便.一起分享学习.. 正文 SO文件汉化心得 --By布加迪20   2014/08 我自己也是新手.研究了好久.网上也找不到相关教程.所以决定写一个比較具体的教程.教程是关于汉化so文件时出现的字符串长度不够的问题,后面还有做字库的简单教程.相关文件都在文章结尾处,假设出现排版问题.建议在手机上用WPS看,选适应手机就好了. 汉化so改动偏移 IDA在电脑上用.HE是安卓上的

【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率

2438: [中山市选2011]杀人游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1638  Solved: 433[Submit][Status][Discuss] Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民. 假如查证的对象是杀手, 杀手将会把警察干掉. 现在警察掌

我的软件工程实践总结

软工工程的实践总算是告一段落了,回想起来,最初的时候对软工的实践还是抱有很大的期待的.但往往希望越大失望越大,直到软工结束的时候也没能做出一个像样的APP.也许是因为几个人都是新手,害怕去面对这些完全没接触过的东西,所以在一开始的时候,大家都很有默契的绝口不提有关软工实践的事,直到快要演示的前几周才开始陆陆续续着手这件事.回想起开学对这门课的期望是能够做出一个有意义的,有人使用的项目.虽然到最后只是勉强写完了一个单机版的二手市场,离当初的期望有些远,但是在做这个项目的过程中不断碰到问题,然后不断

Java——异常处理

[异常] <1>运行期出现的错误(不是编译时的语法错误). <2>观察错误的名字和行号很重要! [程序分析:数组越界] int [] arr = {1,2,3}; System.out.println(arr[4]); 注:在C和C++中编译通过,因为在C和C++中不进行数组越界的检查(这就很容易造成缓冲区溢出漏洞). Java可以检查数组下标是否越界,但是有一定的检查范围. 报错:Exception in thread 'main' java.lang.ArrayIndexOut

为什么有些人工作是痛苦的?

为什么有些人工作是痛苦的? 身边一个朋友,每天工作内容多但是都不复杂,但都是些特别容易出错的东西,所以每天兢兢战战,做不好又要被领导批评,这种恶性循环导致每天心神不宁,感觉工作是痛苦的, 实在不忍心看到朋友这种焦虑的状态,我们聊了很久总结了以下原因,晒出来,也希望帮助更多的朋友每天工作顺利. 一.工作是生活的一部分 我曾经说过,工作中是不会带入情绪的,也不能影响到工作之外的生活的:我现在觉着这样是不妥的,因为除了睡觉,每天花时间最多的事就是工作,工作成绩的好坏的确会影响到生活质量的.那么我们必须