常见迭代器错误的解释

use*_*466 2 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

kos*_*osa 5

if( ((String)it.next()).length() == len)
         System.out.println( it.next() );
         }
Run Code Online (Sandbox Code Playgroud)

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  );
       }
Run Code Online (Sandbox Code Playgroud)