2

ファイルの内容を出力し、ファイルから文字数と単語数を出力する次のコードを作成しました

import java.io.*;
import java.util.*;

 class Ass53
{ 


public static void main(String args[]) throws Exception
{
    File file=new File("sample.txt");
    Scanner sc=new Scanner(new FileInputStream(file));
    String line,line1;
    int count1=0;
    int count=0;        

    /*Loop for printing contents of file*/
    while(sc.hasNextLine())
    {
        line=sc.nextLine();
        System.out.println(line);
    }


    /*loop for counting number of character in file*/
    while(sc.hasNext())
    {
            line1=sc.next();
        for(int i=1;i<=line1.length();i++)
            count1++;
    }
    System.out.println(count1); 


    /*loop for counting number of words in a file*/
    while(sc.hasNext())
    {
            sc.next();
            count++;
    }
    System.out.println("Number of words: " + count);


    }


 }

問題は、最初の while ループのみが実行されていることです。その理由は、最初の while ループの sc.nextLine である可能性があると思います。

それを修正する方法はありますか?他の while ループも機能するようにしたい

4

3 に答える 3

2

あなたがしているたびに、nextLine()あなたは現在のラインを越えてスキャナーを進めています。最初のループが終了すると、ファイルの最後に到達し、スキャンするものがなくなります。

解決策は、各ループの前にスキャナーを再作成することです。2番目と3番目の前にこれを繰り返すだけwhileです:

sc=new Scanner(new FileInputStream(file));

別の解決策は、より多くの作業を伴いますが、より洗練されています。単一のループを使用してすべての行をに格納し、List<String>すべての行を分析して単語と文字をカウントします。

于 2013-02-24T18:34:00.043 に答える
1

毎回ループを終えたら、scをストリームの先頭に戻す必要があります。

これは宿題のように見えるので、コードを投稿しません。クラス名Ass53は「Assignment53」だと思います。ストリームを最初に戻す方法を調べて理解するのはそれほど難しいことではありません。

現在のところ、実際には同じファイルを3回読み取っているため、これを1つのループにまとめることができます。小さいファイルであればそれほど悪くはないかもしれませんが、大きいファイルであれば遅くなります。

于 2013-02-24T18:33:10.500 に答える
1

最初のループは、「ファイルの行がなくなるまで、その行を読み取って印刷する」と言っています。次に、2番目のループはファイル内でさらに多くの文字を探しますが、もちろんそこには何もありません。

1つのオプションは、各ループの前にスキャナーをリセットすることです。最初のループの後の各ループの前に、スキャナーを閉じて破棄し、新しいスキャナーを作成します。

ただし、もっと良い方法があります。ファイルを文字ごとに(たとえば、BufferedReaderを使用して)ウォークスルーし、各文字の文字数と各改行文字の改行数をインクリメントできます。改行で終わらないファイルを考慮することを忘れないでください。必要なループは1つだけで、合計文字数と行数の両方を計算しました。

于 2013-02-24T18:33:41.327 に答える