0

テキスト入力を分析するはずのコードを実行するたびに、次の出力が得られます。単語と英数字の数を数えるために使用される他の方法は機能しますが、5 文字以上の単語を吐き出すと想定される他の方法は機能しません。そのような要素がないと言うエラーが表示され続けます。これは、イテレータがこれ以上要素を見つけることができないことを意味しますが、while ステートメントを使用しているため、発生するべきではありません。

出力は次のとおりです。

テキストを入力
 ランニング
 単語数: 1
 英数字カウント: 7
 単語の昇順
 ランニング
 5文字以上の単語
 スレッド「メイン」での例外 java.util.NoSuchElementException
java.util.AbstractList$Itr.next (不明なソース) で
com.yahoo.chris511026.paragraphcount.ManifoldMethod.wordSort (ManifoldMethod.java:55) で
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++;
    }
4

2 に答える 2

2

next()問題は、 2 回呼び出していることです。

       while(itr.hasNext())

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

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

これは、if条件が満たされると、 の本体が、一致した要素のifに来る要素を操作しようとすることを意味します。

反復ごとに 1 回呼び出し、結果を変数に格納する必要があります。

于 2013-01-21T19:49:58.833 に答える
0

whileメソッド内でitr.next()を2回呼び出します。2回目に呼び出されると、例外がスローされます(要素がなくなったためです。おそらく、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.");
    }
}
于 2013-01-21T19:50:46.200 に答える