我在arrayList的线程“main”java.util.NoSuchElementException中一直遇到异常

时间:2013-01-21 19:47:45

标签: java arraylist

每当我运行我应该分析文本输入的代码时,我得到以下输出。用于计算单词和字母数字数字的其他方法有效,但另一种假定用五个或更多字符吐出单词的方法不起作用。我一直得到一个错误,说没有这样的元素,我猜这意味着迭代器找不到任何更多的元素,但不应该发生,因为我使用了一个while语句。

这是输出:

 Enter text 
 running
 Word count: 1
 Alphanumeric count: 7
 Words in ascending order 
 running
 Words with five or more characters 
 Exception in thread "main" java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(Unknown Source)
at com.yahoo.chris511026.paragraphcount.ManifoldMethod.wordSort(ManifoldMethod.java:55)
at com.yahoo.chris511026.paragraphcount.ParagraphAnalyzer.main(ParagraphAnalyzer.java:15)

我的代码:

package com.yahoo.chris511026.paragraphcount;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class ManifoldMethod { 

static ArrayList<String> stringList = new ArrayList<String>();

public static void wordCount(String data) {

        int counter = 0;

            for (String str : data.split("[^a-zA-Z-']+")) {

                stringList.add(str);
                counter++;

            }

        System.out.println("Word count: " + counter);

}


public static void alphanumericCount(String data) {

    data = data.replaceAll("[[^a-z]&&[^A-Z]&&[^0-9]]", "");

    System.out.println("Alphanumeric count: " + data.length());

}

public static void wordSort(String data) { 

    Collections.sort(stringList, new StringComparator());

    System.out.println("Words in ascending order ");  

        for (String s: stringList)

            System.out.println(s);

    System.out.println("Words with five or more characters ");

        int count=0;

        Iterator<String> itr=stringList.iterator();

            while(itr.hasNext())

 if (itr.next().replaceAll("[[^a-z]&&[^A-Z]&&[^0-9]]", "").length  ()>=5)         {

                    System.out.println(itr.next());
                    count++;

                }

                if (count==0) {

                    System.out.println("None.");

                }

}

  }

修改

我更正了它并使用了String str=itr.next(); 这是新的部门。但现在我得到String变量无法解析为变量。为什么呢?

while(itr.hasNext())
    String str=itr.next();  
    if (str.replaceAll("[[^a-z]&&[^A-Z]&&[^0-9]]", "").length  ()>=5) {
        System.out.println(str);
        count++;
    }

2 个答案:

答案 0 :(得分:2)

问题是您要拨打next()两次:

       while(itr.hasNext())

           if (itr.next().replaceAll("[[^a-z]&&[^A-Z]&&[^0-9]]", "").length  ()>=5)         {
           //      ^^^^^^

                System.out.println(itr.next());
                //                     ^^^^^^

这意味着当满足if条件时,if的正文会尝试对之后匹配的元素进行操作。

每次迭代需要调用一次并将结果存储在变量中。

答案 1 :(得分:0)

你在while方法中调用itr.next()两次。第二次被调用时,异常被抛出(因为那里没有更多的元素。你应该把你的while循环改写成这样的东西:

while(itr.hasNext()) {
    String s = itr.next();
    if (s.replaceAll("[[^a-z]&&[^A-Z]&&[^0-9]]", "").length  ()>=5)         {
        System.out.println(s);
        count++;
    }
    if (count==0) {
        System.out.println("None.");
    }
}