2009-08-26 10 views
7

を使用して行番号を得るために、私のプログラムは、このようなものです:?どのように私は、各入力によるスキャナ反復するため、行番号を取得する方法を、次にラインにより、テキストファイルの行を読み取るためにスキャナを使用しますがよスキャナ

s = new Scanner(new BufferedReader(new FileReader("input.txt"))); 

while (s.hasNext()) { 
System.out.print(s.next()); 

これは正常に動作しますが、例えば:

 
1,2,3 
3,4,5 

私は1,2,3行1であり、私がいることを得るのですか2.How 3,4,5はラインであることを意味し、それの行番号を知りたいです?

答えて

16

BufferedReaderの代わりにLineNumberReaderを使用して、スキャナがその行為をしている間に行番号を記録することができます。

LineNumberReader r = new LineNumberReader(new FileReader("input.txt")); 
String l; 

while ((l = r.readLine()) != null) { 
    Scanner s = new Scanner(l); 

    while (s.hasNext()) { 
     System.out.println("Line " + r.getLineNumber() + ": " + s.next()); 
    } 
} 

注:スキャナは先に、現在のトークンの読み込みとして、私は最初の投稿「明白な」解決策は動作しません。

r = new LineNumberReader(new FileReader("input.txt")); 
s = new Scanner(r); 

while (s.hasNext()) { 
    System.out.println("Line " + r.getLineNumber() + ": " + s.next()); 
} 

+0

それは、1行に1つのスキャナを作成するよりも、よりよい解決策はしかし、まだありません残念です。私はあなたの最初の "素朴な"解決策と同じ問題を偶然見つけました。スキャナはあまり先読みして、より小さなバッファを設定する方法はないようです。 – Joffrey

9

だけループでカウンターを置く:

s = new Scanner(new BufferedReader(new FileReader("input.txt"))); 

for (int lineNum=1; s.hasNext(); lineNum++) { 
    System.out.print("Line number " + lineNum + ": " + s.next()); 
} 
+2

これは、.useDelimiter()が改行に設定されている場合にのみ有効です。空白(たとえば単語)をスキャンすると、それよりも単語が数えられます。 – Roalt

+1

私はOPの質問を解決するようにhasNextLine/nextLineを使用するようにサンプルを更新しました。 –

+0

本当にシンプルで、動作します! – tiboo

関連する問題