2016-05-16 8 views
0

入力ストリームに関連付けられたScannerパラメータを持つメソッドを記述し、入力内の文字列の数を数えます。しかし、スタックオーバーフローの例外があります。理由を教えてくれますか?大いに感謝する。再帰を使用して標準入力で読み込む残りの文字列の数をカウントする

import java.util.Scanner; 
public class test { 
public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.println(count(input)); 
} 

public static int count(Scanner input) { 

    if (input.hasNextLine()) 
     return 1 + count(input); 
    else 
     return 1; 
} 
} 
+3

'hasNextLine()'の呼び出しが行を消費しない、あなたがするために 'nextLineを()'を呼び出す必要があります次のものに移動します。 – Titus

+0

文字列または行の数をカウントしますか?数字について気になりますか(つまり、int、float、long、...)? –

+0

@ JonnyHenlyただ文字列と私は私のコンソールで文字列を入力します。 –

答えて

3

あなたはラインreturn 1 + count(input)inputnextLine()を呼び出す必要があります。あなたは次の行をチェックしていますが、実際にはそれを消費するものはありません。つまり、スキャナは処理する行が決してなくなってしまうことはありません。

+0

私はここで少し混乱しています。私はラインの意味を消費するか、正しいコードを私に説明してくれますか? Javaは私の最初のプログラミング言語なので、学ぶべきことがたくさんあります。 –

+1

@StewieGriffin "Consumes"は入力から行を読み込むことを意味します。あなたの入力に 'A'、' B'、 'C'の3行があるとします。ライン 'A'の先頭に_cursor_があるとします。 'hasNextLine()'は、カーソルの後に行があるかどうかを調べますが、カーソルは移動しません。したがって、あなたがそれを呼び出すたびに、カーソルはまだ 'A'の先頭にあります。したがって、あなたは無限の再帰を取得します。 'nextLine()'を呼び出すと、 'A'行が読み込まれ、カーソルは' B'を指します。それは「消費する」という意味です。 – ajb

+0

ajbが言ったこと。ここでもJavaDocを見たいと思うかもしれません:https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html – JeredM

1

あなたの質問では、指定された入力の文字列の数を数えたいとしているので、下のコードは再帰的にそれを行います。他の答えの提案は、与えられた入力の行数を数えます。

注:Scanner#next()は、デフォルトの区切り文字としてスペース(' ')を使用します。

import java.util.Scanner; 

public class test { 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     System.out.println(count(input)); 
    } 

    public static int count(Scanner input) { 
     if (input.hasNext()) { 
      input.next(); // move Scanner's position to the next string 
      return 1 + count(input); 
     } 

     return 0; 
    } 
} 

入力:

The dog barks loudly. 

出力:

4 
+0

My IDEはcount(input.next )part –

+0

@StewieGriffinうん、私はそれを見落とした、私は私の答えを更新し、それを修正しました。 –

関連する問題