黑马程序员技术交流社区

标题: ArrayList遍历的问题 [打印本页]

作者: yaohsieh    时间: 2013-12-26 21:43
标题: ArrayList遍历的问题


  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Iterator;

  4. public class Test {
  5.         public static void main(String[] args) {

  6.                 Collection c = new ArrayList();
  7.                 String s1 = new String("超人");
  8.                 String s2 = new String("蜘蛛侠");
  9.                 String s3 = new String("蝙蝠侠");
  10.                 c.add(s1);
  11.                 c.add(s2);
  12.                 c.add(s3);
  13.                 Iterator it = c.iterator();
  14.                 while (it.hasNext()) {
  15.                         String s = (String) it.next();
  16.                         System.out.println(s);
  17.                         if (s.equals("蜘蛛侠"))
  18.                                 c.remove(s);
  19.                 }
  20.         }
  21. }
复制代码
为什么输出结果是下面,删除的是蜘蛛侠,蝙蝠侠却没了?
  1. 超人
  2. 蜘蛛侠
复制代码






作者: 75100313    时间: 2013-12-26 22:12
本帖最后由 75100313 于 2013-12-26 22:18 编辑

List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。在遍历一次就对了
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Iterator;

  4. public class Test {
  5.         public static void main(String[] args) {

  6.                 Collection c = new ArrayList();
  7.                 String s1 = new String("超人");
  8.                 String s2 = new String("蜘蛛侠");
  9.                 String s3 = new String("蝙蝠侠");
  10.                 c.add(s1);
  11.                 c.add(s2);
  12.                 c.add(s3);
  13.                 Iterator it = c.iterator();
  14.                
  15.                 while (it.hasNext()) {
  16.                         String s = (String) it.next();
  17.                         System.out.println(s);
  18.                         if (s.equals("蜘蛛侠"))
  19.                                 c.remove(s);
  20.                 }
  21.                 System.out.println("删除之后在看c中的数据");
  22.                 Iterator it1 = c.iterator();
  23.                 while (it1.hasNext()) {
  24.                         String s = (String) it1.next();
  25.                         System.out.println(s);

  26.                 }
  27.         }
  28. }
复制代码

作者: 多一点    时间: 2013-12-26 22:23
Iterator it = c.iterator();
                while (it.hasNext()) {
                        String s = (String) it.next();
                        System.out.println(s);
                        if (s.equals("蜘蛛侠"))
                                c.remove(s);
System.out.println(s); 当这里输出蜘蛛侠 之后就把蜘蛛下从it 中删除了,本来it 中有3个元素
{S1,S2,S3} 把蜘蛛侠删了就成了{S1,S3}, 此时it中已经不再有第三个元素,
作者: 75100313    时间: 2013-12-26 22:24
{:soso_e113:}你要是想删除蜘蛛侠 还想打印出来  蝙蝠侠和超人  我建议你这么写
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Iterator;
  4. import java.util.List;

  5. public class Test {
  6.         public static void main(String[] args) {

  7.                 List c = new ArrayList();
  8.                 String s1 = new String("超人");
  9.                 String s2 = new String("蜘蛛侠");
  10.                 String s3 = new String("蝙蝠侠");
  11.                 c.add(s1);
  12.                 c.add(s2);
  13.                 c.add(s3);

  14.                 for (int i = c.size() - 1; i >= 0; i--) {
  15.                         if (c.get(i).equals("蜘蛛侠")) {
  16.                                 c.remove(i);
  17.                         } else {
  18.                                 System.out.println(c.get(i));
  19.                         }
  20.                 }
  21.         }
  22. }
复制代码

作者: yaohsieh    时间: 2013-12-27 00:23
75100313 发表于 2013-12-26 22:12
List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取 ...

懂了,输出的是删除前的蜘蛛侠,但是蜘蛛侠操作发生了,size()减少1,就不显示蝙蝠侠了
作者: yaohsieh    时间: 2013-12-27 00:24
多一点 发表于 2013-12-26 22:23
Iterator it = c.iterator();
                while (it.hasNext()) {
                        String s ...

感谢分析,很到位!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2