常见迭代器错误的解释

时间:2012-10-31 20:25:51

标签: java collections iterator

import java.io.*;
import javax.swing.JOptionPane;
import java.util.*;

public class lesson {
     static void printAll(ArrayList<String> names, int len)
      {
         Iterator it = names.iterator();
         while( it.hasNext() )
         {
         if( ((String)it.next()).length() == len)
         System.out.println( it.next() );
         }
      }
    public static void main(String[] args) throws IOException {
        ArrayList<String> names = new ArrayList<String>();
        names.add("Jan");
        names.add("Ivan");
        names.add("Tom");
        names.add("George");
        printAll(names,3);
    }
}

为什么输出Ivan,George,不应该只打印长度为3的名字(Jan和Tom)?

7 个答案:

答案 0 :(得分:5)

if( ((String)it.next()).length() == len)
         System.out.println( it.next() );
         }

it.next()将迭代器推进到一个元素。你正在做it.next()两次。

if( ((String)it.next()).length() == len)前进一次,现在迭代器指向next()

将其更改为以下内容:

 it.next() prints next() element in iterator.
      {
       //Get once.
        String nextName = (String)it.next();
         if( nextName .length() == len)
         System.out.println(nextName  );
       }

答案 1 :(得分:4)

帮自己一个忙,并学会使用增强的循环,它会阻止你犯下你做的错误:

 static void printAll(ArrayList<String> names, int len)
 {
     for (String name : names) {
       if (name.length() == len)
         System.out.println( name );
     }
 }

答案 2 :(得分:2)

你正在调用iterator.next()两次,第二次调用会提前。按照以下方法,将其存储在变量中并进行检查

 Iterator it = names.iterator();
   String next =(String)it.next(); 
         while( it.hasNext() )
         {
         if( (next).length() == len)
         System.out.println( next );
         }

答案 3 :(得分:2)

更改以下内容以避免两次it.next()次调用,因为它会比较一个元素的长度和可用性,并尝试打印另一个元素。

    while( it.hasNext() )
     {
       if( ((String)it.next()).length() == len)
       System.out.println( it.next() );
     }

    while( it.hasNext() )
     {
       String element = (String)it.next();
       if(element.length() == len)
          System.out.println( element);
     }

答案 4 :(得分:2)

如果您想要两次值,则将其存储在某个变量中。如果你调用它两次,那么你的迭代器就会向前移动,这就是为什么在打印它时会给你结果

while( it.hasNext() )
     {
       String str = it.next();
        if( (str.length() == len)
          System.out.println(str);
     }

答案 5 :(得分:1)

致电it.next()

  1. 返回集合中的当前元素。
  2. 提升迭代器的位置。
  3. 你在循环体中调用next()两次。你应该确保只调用一次:

    for (Iterator<String> it = names.iterator(); it.hasNext();) {
        String name = it.next();
        if (name.length() == len) {
            System.out.println(name);
        }
    }
    

    或使用增强型循环

    for (String name : names) {
        if (name.length() == len) {
            System.out.println(name);
        }
    }
    

答案 6 :(得分:0)

这应该做你想要的。从ArrayList打印每个字符串只有3个字符:

import java.io.*;
import javax.swing.JOptionPane;
import java.util.*;

public class lesson {
 static void printAll(ArrayList<String> names, int len)
  {
     for (String s : names)
     if (s.length() == len)
     {
     System.out.println(s);
     }
  }
  public static void main(String[] args) throws IOException {
    ArrayList<String> names = new ArrayList<String>();
    names.add("Jan")
    names.add("Ivan");
    names.add("Tom");
    names.add("George");
    printAll(names,3);
   }
}