黑马程序员技术交流社区

标题: 大家帮忙看下我为什么得不到我想要的结果,去除"abc". [打印本页]

作者: 提菩--空    时间: 2014-7-13 03:20
标题: 大家帮忙看下我为什么得不到我想要的结果,去除"abc".
本帖最后由 提菩--空 于 2014-7-15 11:43 编辑

public class Test9
{
        
        public static void main(String[] args)
        {
                ArrayList<String> alist = new ArrayList<String>();
                alist.add("sdkfs");
                alist.add("abc");
                alist.add("hello");
                alist.add("abc");
                                
                Iterator<String> it = alist.iterator();
               
                while(it.hasNext())
                {
                        if(it.next().equals("abc"))
                        {
                                it.remove();//这边我明明删除了与字符串abc相等的为什么还得不我想的结果
                        }else{
                                System.out.println(it.next());
                        }                        
                }               
        }
}


作者: 496080891    时间: 2014-7-13 07:46
本帖最后由 496080891 于 2014-7-13 07:54 编辑
  1. while(it.hasNext())
  2. {
  3.         //String i = it.next();
  4.                 if(it.next().equals("abc"))
  5.         //if(i.equals("abc"))
  6.                 {
  7.                                 it.remove();
  8.                                 /*
  9.                                         it.next()是"sdkfs"和"abc"比较
  10.                                         不相同所以执行else语句,所以打印出"abc";
  11.                                         然后回来又执行了it.next(),这时它的值是"hello";
  12.                                         所以又执行了else语句,打印出"abc";
  13.                                         it.next()执行一次,指针就向下走一步;

  14.                                         解决办法:定义变量来接收it.next()的值,
  15.                                                         使指针位置不会变。
  16.                                 */
  17.                 }else{
  18.                                 System.out.println(it.next());
  19.                                 //System.out.println(i);
  20.                 }                        
  21. }               
复制代码



作者: 吴俊勇    时间: 2014-7-13 22:57
496080891 发表于 2014-7-13 07:46

  {it.next()是"sdkfs"和"abc"比较
是 不相同所以执行else语句,所以打印出"abc";}看不懂

作者: 胥亮    时间: 2014-7-14 07:03
本帖最后由 胥亮 于 2014-7-14 07:04 编辑

楼主首先在if语句中调用了it.next()方法   使指针指到了sdkfs由于和abc不等 所以执行else 在else语句中又执行了it.next()方法  这时指针指向了abc所以打印出abc   下面那一次一样的   判断的是一个值 打印的却是下面的字符串
应该改成

  1. <p> import java.util.*;
  2. public class Test9
  3. {
  4.          
  5.          public static void main(String[] args)
  6.          {
  7.                  ArrayList<String> alist = new ArrayList<String>();
  8.                  alist.add("sdkfs");
  9.                  alist.add("abc");
  10.                  alist.add("hello");
  11.                  alist.add("abc");
  12.                                  
  13.                  Iterator<String> it = alist.iterator();
  14.                  
  15.                  while(it.hasNext())
  16.                  {
  17.                          String str=it.next();//在这里定义一个零时变量存储一下  对str进行判断
  18.                          if(str.equals("abc"))
  19.                          {
  20.                                  it.remove();
  21.                         }else{
  22.                                  System.out.println(str);
  23.                          }                        
  24.                  }               
  25.          }
  26. }
  27. </p>
复制代码


作者: sugar    时间: 2014-7-14 09:10
  1. import java.util.*;
  2. public class Test9
  3. {
  4.         
  5.         public static void main(String[] args)
  6.         {
  7.                 ArrayList<String> alist = new ArrayList<String>();
  8.                 alist.add("sdkfs");
  9.                 alist.add("abc");
  10.                 alist.add("hello");
  11.                 alist.add("abc");
  12.                                 
  13.                 Iterator<String> it = alist.iterator();
  14.                
  15.                 while(it.hasNext())
  16.                 {
  17.                                             String s=it.next();//这个位置获取一次,你原来的程序获取两次、
  18.                         if(s.equals("abc"))
  19.                         {
  20.                                 it.remove();//这边我明明删除了与字符串abc相等的为什么还得不我想的结果
  21.                         }else{
  22.                                 System.out.println(s);
  23.                         }                        
  24.                 }               
  25.         }
  26. }
复制代码


循环中it.next();执行两次,才判断it.hasNext()的;
第一次时 "sdkfs"不等于"abc"; 输出的时it.next();这时输出的则是第二元素"abc";
这时候,判断it.hasNext(); 这时it.next()为第三个元素"hello"不等于"abc";又输出it.next();输出的是第四个元素;

每当it.next()时 元素都向下走一个位置;
作者: lsquare    时间: 2014-7-14 10:24
解决办法:定义变量来接收it.next()的值,
使指针位置不会变。
作者: idency    时间: 2014-7-14 16:44
Iterator不支持在迭代过程中删除元素,只要改成List专用的ListIterator就ok了
作者: ddewym123    时间: 2014-7-14 18:33
板凳、报纸说得对!
作者: 奋斗的小耗子    时间: 2014-7-15 00:39
视频教程里有说,在迭代时,循环中的next()被调用一次,就需要hasNext()判断一次,
楼主每一次的循环中,hasNext()对应两次next()
作者: 提菩--空    时间: 2014-7-15 10:06
谢谢大家,我自己也找到了问题所在。
作者: 薛振宇    时间: 2014-7-15 17:20
将“abc”跳过去了,就没比较它




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