A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 提菩--空 于 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());
                        }                        
                }               
        }
}

10 个回复

倒序浏览
本帖最后由 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. }               
复制代码


回复 使用道具 举报

  {it.next()是"sdkfs"和"abc"比较
是 不相同所以执行else语句,所以打印出"abc";}看不懂
回复 使用道具 举报
本帖最后由 胥亮 于 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>
复制代码

回复 使用道具 举报
  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()时 元素都向下走一个位置;
回复 使用道具 举报
解决办法:定义变量来接收it.next()的值,
使指针位置不会变。
回复 使用道具 举报
idency 高级黑马 2014-7-14 16:44:14
7#
Iterator不支持在迭代过程中删除元素,只要改成List专用的ListIterator就ok了
回复 使用道具 举报
板凳、报纸说得对!
回复 使用道具 举报
视频教程里有说,在迭代时,循环中的next()被调用一次,就需要hasNext()判断一次,
楼主每一次的循环中,hasNext()对应两次next()
回复 使用道具 举报
谢谢大家,我自己也找到了问题所在。
回复 使用道具 举报
将“abc”跳过去了,就没比较它
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马