2
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)?

4

7 回答 7

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  );
       }
于 2012-10-31T20:26:57.617 回答
4

帮自己一个忙,学习使用增强的 for循环,它可以防止你犯下你所犯的错误:

 static void printAll(ArrayList<String> names, int len)
 {
     for (String name : names) {
       if (name.length() == len)
         System.out.println( name );
     }
 }
于 2012-10-31T20:28:30.703 回答
2

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

 Iterator it = names.iterator();
   String next =(String)it.next(); 
         while( it.hasNext() )
         {
         if( (next).length() == len)
         System.out.println( next );
         }
于 2012-10-31T20:27:35.303 回答
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);
     }
于 2012-10-31T20:28:52.107 回答
2

如果您想要两次值,则将其存储在某个变量中。如果您调用它两次,那么您的迭代器将继续前进,这就是为什么在打印时它会为您提供该结果

while( it.hasNext() )
     {
       String str = it.next();
        if( (str.length() == len)
          System.out.println(str);
     }
于 2012-10-31T20:28:55.070 回答
1

呼吁it.next()

  1. 返回集合中的当前元素。
  2. 推进迭代器的位置。

你在循环体中调用next()了两次。您应该确保只调用一次:

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

或使用增强的 for 循环

for (String name : names) {
    if (name.length() == len) {
        System.out.println(name);
    }
}
于 2012-10-31T20:34:22.680 回答
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);
   }
}
于 2012-10-31T20:32:25.490 回答