2016-11-23 20 views
-1

入力を解釈するためにJavaを使用しています。私はBufferedReaderを使用しています。私の目標は、charを読み込んだ後に量の行を読み込むことです。ここで-1は停止コマンドです。Java:BufferedReaderで入力を読み取るときにエラーが発生しました。

CASE 1 - L1 
CASE 1 - L2 
CASE 2 - L1 
CASE 2 - L2 
CASE 2 - L3 

私は正しい方法で行を取得していますということは何を意味するでしょう:何か

2 
CASE 1 - L1 
CASE 1 - L2 
3 
CASE 2 - L1 
CASE 2 - L2 
CASE 2 - L3 
-1 

次のように私の目標は、単に出力として持っているだろう。

L: 
L:CASE 1 - L1 
L: - L2 
L: 
L:CASE 2 - L1 
L:CASE 2 - L2 
L: - L3 

私が間違っているのは何:

public class TESTE { 

    public static void main(String[] args) throws IOException { 
     BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); 
     int state; 

     while ((state = buffer.read()) != 45) { 
      char c = (char) state; 
      if (Character.isDigit(c)) { 
       int n = Character.getNumericValue(c); 
       for (int i = 0; i < n; ++i) { 
        System.out.println("L:" + buffer.readLine()); 
        System.out.println(); 
       } 
      } 
     } 

    } 

} 

私の出力があるいくつかの理由について次のように私のコードはありますか?その入力に対処するエレガントな方法はありますか?

答えて

0

ここには何が起こったのですか。 '2'

  • ある

    1. buffer.read()戻り502
    2. 読む二行

    である、nに変換今、この時点では、次のバッファで何ですか? A \nの直後'2'!あなたの最初の出力を得る理由です。

    L: 
    

    空の行。

    今後も継続する必要はありません。プロセス全体が壊れています。 、一度だけ表示されます

    一つの方法は、それを行うには:それは、最初のintを読んだ後、入力の全体の残りの部分が読み込まれることになる場合、およびラベル「L」であった場合

    Scanner in = new Scanner(System.in); 
        while (true) { 
         int n = Integer.parseInt(in.nextLine()); 
         if (n == -1) break; 
         for (int i = 0; i < n; i++) { 
          System.out.println("L:" + in.nextLine()); 
         } 
        } 
    
  • +0

    私はそれにちりばめられました!それから私はそれを知った\ n !!私はちょうどbuffer.readLine()を追加します。 int n = Character.getNumericValue(c)の前に。それはうまくいった!あなたのソリューションはまた私に同じ期待される出力を与える!しかし、私のものよりも短く、実際にはよりエレガントな私はそれを使用します!ありがとうございました !!! –

    +0

    @ Pj-ユーザーが数値以外の入力をした場合、このコードは私の答えで処理された例外を発生させます。短いコードは、エレガントであることを意味するものではありません! –

    +0

    @ワシアマドはありがとう!それは非常に良い点でした!私はそれにもっと注意するでしょう!もう一度ありがとうございます! –

    0

    forループ内にはbuffer.readline()があります。だから、あなたは本質的にあなたのすべての行を読んでいる(私はあなたが行単位で読むことを期待していたと思う)。

    コードを簡略化するために、機能readLine()を使用したい場合があります。出力の終了に達するとnullを返します。これにより、入力の終了を示す少し不器用な-1を排除することができます。

    String line; 
    while ((line = buffer.readLine()) != null) { 
        if (!Character.isDigit(line.charAt(0)) { 
         System.out.println("L:" + line); 
        } 
    } 
    
    +0

    右 ?また、出力に「3」が含まれている必要があります。 –

    +0

    はい、いいえ。はい、最初のintの後に入力全体を読み込みます。いいえ、 '' L: ''は毎回表示されます。これは 'for'ループ内にもあるからです。 – dave

    +0

    私は種類がbuffer.readLine()を追加する "期待"を取得します。 int n = Characterの前。getNumericValue(c);チャーを読んだ後もまだ読んでいた行全体が空であるように見えるので、私はその行をクリアしていたと思います。 –

    0

    包括的な答えは、あなたの目的に役立つようにすることができます。 1桁の数字を考慮するよりも、値が9よりも大きい可能性があるため、整数を考慮する方が良いことに注意してください。その場合、1文字を考えるだけでは不十分です!

    public static void main(String[] args) throws IOException { 
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); 
        String line; 
    
        while ((line = buffer.readLine()) != null) { 
         int value; 
         try { 
          value = Integer.parseInt(line); // if user gives non-integer values as input 
         } catch (NumberFormatException ex) { 
          System.out.println("Error!"); 
          continue; // print error message and then continue 
         } 
         if (value == -1) { 
          break; 
         } 
         for (int i = 0; i < value; i++) { 
          line = buffer.readLine(); // keep asking for input from user 
          System.out.println("L:" + line); 
         } 
        } 
    
    } 
    
    +0

    これはちょっと変わった私の元々のコードもうまくいきます:buffer.readLine(); int n = Character.getNumericValue(c)の前に。それは私にあなたと同じ出力を与える!どうもありがとうございました! –