ユーザーからの入力を受け取り、テキストファイルの行、単語、文字の量を印刷しようとしています。ただし、正しいのは単語の数だけで、行と文字には常に0が出力されます。
import Java.util.*;
import Java.io.*;
public class TextFileInfoPrinter
{
public static void main(String[]args) throws FileNotFoundException
{
Scanner console = new Scanner(System.in);
System.out.println("File to be read: ");
String inputFile = console.next();
File file = new File(inputFile);
Scanner in = new Scanner(file);
int words = 0;
int lines = 0;
int chars = 0;
while(in.hasNext())
{
in.next();
words++;
}
while(in.hasNextLine())
{
in.nextLine();
lines++;
}
while(in.hasNextByte())
{
in.nextByte();
chars++;
}
System.out.println("Number of lines: " + lines);
System.out.println("Number of words: " + words);
System.out.println("Number of characters: " + chars);
}
}
試す
int words = 0;
int lines = 0;
int chars = 0;
while(in.hasNextLine()) {
lines++;
String line = in.nextLine();
chars += line.length();
words += new StringTokenizer(line, " ,").countTokens();
}
in.next();
は、最初のwhile()
のすべての行を消費しています。最初のwhileループの終了後、入力ストリームで読み取る文字はもうありません。
あなたはnestあなたのキャラクターとワードカウントwithin a whileループカウント行でなければなりません。
最良の答えは
int words = 0;
int lines = 0;
int chars = 0;
while(in.hasNextLine()) {
lines++;
String line = in.nextLine();
for(int i=0;i<line.length();i++)
{
if(line.charAt(i)!=' ' && line.charAt(i)!='\n')
chars ++;
}
words += new StringTokenizer(line, " ,").countTokens();
}
次のように考える理由はありますか?
while(in.hasNext())
{
in.next();
words++;
}
not入力ストリーム全体を消費しますか?
willそうすることで、他の2つのwhile
ループが繰り返されることはありません。これが、単語と行の値がまだゼロに設定されている理由です。
おそらく、ファイルを1文字ずつ読み取り、ループのたびに文字数を増やし、文字を検出して他のカウンターをインクリメントするかどうかを決定する方が良いでしょう。
基本的に、\n
が見つかった場合は常に、行数を増やします。ストリームの最後の文字が\n
でない場合も、これを行う必要があります。
そして、空白から非空白に移行するときはいつでも、Wordの数を増やしてください(ストリームの開始時に、おそらく難しいトリッキーなEdgeケース処理がありますが、これは実装の問題です)。
次の疑似コードのようなものを見ています。
# Init counters and last character
charCount = 0
wordCount = 0
lineCount = 0
lastChar = ' '
# Start loop.
currChar = getNextChar()
while currChar != EOF:
# Every character counts.
charCount++;
# Words only on whitespace transitions.
if isWhite(lastChar) && !isWhite(currChar):
wordCount++
# Lines only on newline characters.
if currChar == '\n':
lineCount++;
lastChar = currChar
currChar = getNextChar()
# Handle incomplete last line.
if lastChar != '\n':
lineCount++;
私はJava=エキスパートではありませんが、_.hasNext
_、_.hasNextLine
_、および_.hasNextByte
_はすべて同じファイル位置インジケーターを使用し、インクリメントすると思います。あなたはAashrayで述べたように新しいスキャナーを作成するか、RandomAccessFileを使用して各ループの後にfile.seek(0);
を呼び出すことにより、リセットする必要があります。
@Cthulhuの回答に同意します。コードでは、Scanner
オブジェクト(in
)をリセットできます。
in.reset();
これにより、ファイルの最初の行でinオブジェクトがリセットされます。
正規表現を使用してカウントすることができます。
String subject = "First Line\n Second Line\nThird Line";
Matcher wordM = Pattern.compile("\\b\\S+?\\b").matcher(subject); //matches a Word
Matcher charM = Pattern.compile(".").matcher(subject); //matches a character
Matcher newLineM = Pattern.compile("\\r?\\n").matcher(subject); //matches a linebreak
int words=0,chars=0,newLines=1; //newLines is initially 1 because the first line has no corresponding linebreak
while(wordM.find()) words++;
while(charM.find()) chars++;
while(newLineM.find()) newLines++;
System.out.println("Words: "+words);
System.out.println("Chars: "+chars);
System.out.println("Lines: "+newLines);
while(in.hasNextLine()) {
lines++;
String line = in.nextLine();
for(int i=0;i<line.length();i++)
{
if(line.charAt(i)!=' ' && line.charAt(i)!='\n')
chars ++;
}
words += new StringTokenizer(line, " ,;:.").countTokens();
}
ファイルポインタは、最初のwhileが実行されるときにファイルの最後に設定されます。これを試して:
Scanner in = new Scanner(file);
while(in.hasNext())
{
in.next();
words++;
}
in = new Scanner(file);
while(in.hasNextLine())
{
in.nextLine();
lines++;
}
in = new Scanner(file);
while(in.hasNextByte())
{
in.nextByte();
chars++;
}
import Java.io.*;
class wordcount
{
public static int words=0;
public static int lines=0;
public static int chars=0;
public static void wc(InputStreamReader isr)throws IOException
{
int c=0;
boolean lastwhite=true;
while((c=isr.read())!=-1)
{
chars++;
if(c=='\n')
lines++;
if(c=='\t' || c==' ' || c=='\n')
++words;
if(chars!=0)
++chars;
}
}
public static void main(String[] args)
{
FileReader fr;
try
{
if(args.length==0)
{
wc(new InputStreamReader(System.in));
}
else
{
for(int i=0;i<args.length;i++)
{
fr=new FileReader(args[i]);
wc(fr);
}
}
}
catch(IOException ie)
{
return;
}
System.out.println(lines+" "+words+" "+chars);
}
}