1
public static void main(String args[]) throws FileNotFoundException
{       
    String inputFileName = "textfile.txt";

    printFileStats(inputFileName);
}
public static void printFileStats(String fileName) throws FileNotFoundException
{
    String outputFileName = "outputtextfile.txt";
    File inputFile = new File(fileName);
    Scanner in = new Scanner(inputFile);
    PrintWriter out = new PrintWriter(outputFileName);

    int lines = 0;
    int words = 0;
    int characters = 0;

    while(in.hasNextLine())
    {               
        lines++;    
        while(in.hasNext())
        {
            in.next();
            words++;
        }   
    }

    out.println("Lines: " + lines);
    out.println("Words: " + words);
    out.println("Characters: " + characters);

    in.close();
    out.close();

}

5行を含むテキストファイルがあります

this is  
a text  
file  
full of stuff  
and lines  

コードは出力ファイルを作成します

Lines: 1  
Words: 10 
Characters: 0

ただし、ファイル内の単語数を読み取る機能を削除すると、行数 (5) が正しく表示されます。なぜこうなった?

4

4 に答える 4

4

内側のwhileループがファイル全体を飲み込んでいます。各行の単語数を数えたいですよね?代わりにこれを試してください:

while (in.hasNextLine())
{               
    lines++;    
    String line = in.nextLine();
    for (String word : line.split("\\s")) 
    {
        words++;
    }   
}

スペースでの分割は、トークン化 (ワード分割) に対する非常に単純なアプローチであり、ここにあるような単純な例でのみ機能することに注意してください。

もちろん、words += line.split("\\s").length;その内側のループの代わりに行うこともできます。

于 2013-10-24T00:28:13.093 に答える
1

in.hasNext()改行文字を含むin.next()すべての空白文字を単語区切り文字として扱います。内側のループは、すべての単語をカウントしているため、すべての改行を食べています。

于 2013-10-24T00:27:47.457 に答える
0

その理由は、hasNext()改行を気にしないからです。

したがって、while(in.hasNextLine())ループに入りますが、ループでファイル全体を消費しているwhile(in.hasNext())ため、1 行と 10 語になります。

hasNext()-> EOL-Characters で消費されるトークンを確認し、行数を増やします。

また:

を使用String line = scanner.nextLine()して正確に 1 行を取得し、2 番目のスキャナーを使用してその行のすべてのトークンをフェッチします。scanner2 = new Scanner(line); while(scanner2.hasNext())

于 2013-10-24T00:28:38.710 に答える