2012-05-11 13 views
0

Javaでファイルを読み込む際に問題があります。どのように見えるかのファイルJavaでファイルを読むのに問題があります

:私は何をしたいか

Answer 1: 
1. This is an apple 
2. Something 
Answer 2: 
1. This is a cool website 
2. I love banana 
3. This is a table 
4. Programming is fun 
Answer 3. 
1. Hello World 
.... 

は二つの項目に区切りです: 一つは、回答数です。もう一つは答えのリストです。

したがって、Answerというオブジェクトクラスがあるとします。 回答番号の文字列 回答リスト。

これはオブジェクトクラスに入れる前にこれまで私のコードをデバッグするために行ったことです。しかし、私は正しい結果を得ることができません。

public void reader(String file) throws FileNotFoundException, IOException { 
    FileReader fR = new FileReader(file); 
    BufferedReader bR = new BufferedReader(fR); 
    String line = null; 

    int count = 0 ; 
    String blockNum = ""; 
    String printState = "" ; 
    while ((line = bR.readLine()) != null) { 
     if(line.contains("Answer")){ 
      //System.out.println("Contain Answer statement: " + line); 
      count++; 
      blockNum = line; 
      printState = ""; 
     } 
     else{ 
      //System.out.println("No Answer Statement: " + line); 
      printState += line + "/" ; 
     } 

     System.out.println(count + " " + blockNum + " " + printState); 
    } 

    // Close the input stream 
    bR.close(); 
    fR.close(); 
} 

私はコーディング中に何か愚かなことをしました。私はそれを分かち合うように読む方法があまり分かりません。

今の出力は次のようになります。

1 Answer 1: 
1 Answer 1: 1. This is an apple/
1 Answer 1: 1. This is an apple/2. Something/
2 Answer 2: 
2 Answer 2: 1. This is a cool website/
2 Answer 2: 1. This is a cool website/2. I love banana/
2 Answer 2: 1. This is a cool website/2. I love banana/3. This is a table/
2 Answer 2: 1. This is a cool website/2. I love banana/3. This is a table/4. Programming is fun/
3 Answer 3.  
3 Answer 3. 1. Hello World/

しかし、私は、出力はこのような何かになりたい:あなたはあなたが入力の各ラインのための出力の行を印刷している

1 Answer 1: 1. This is an apple/2. Something/
2 Answer 2: 1. This is a cool website/2. I love banana/3. This is a table/4. Programming is fun/ 
3 Answer 3. 1. Hello World/
+0

読み取った内容をMap に出力したい場合があります。 – Vulcan

答えて

1

1つの解決策は、ブール値としてprintTimeのフラグを使用します。

boolean printTime = false; 

... 
    if(line.contains("Answer")) { 

     if (printTime!= false) { 
      System.out.println(count + " " + blockNum + " " + printState); 
      printTime=false; 
     } 
     ... 
    }else{ 
     //System.out.println("No Answer Statement: " + line); 
     printState += line + "/" ; 
     printTime=true; // you have one answer 
    } 
    ...  

あなたは1行に1つの答えのために、いくつかのprintStateを持つことができ、そのよう最後の答えのためにしばらくの終わりに

を少し余分な印刷を追加します。

List<Answer> listOfAnswer = new LinkedList<Answer>(); 
Answer answer; 
... 
if(line.contains("Answer")){ 
      //System.out.println("Contain Answer statement: " + line); 
      count++; 

      answer = new Answer(line); 
      listOfAnswer.add(answer) 
     } 
     else{ 
      answer.add(new Answer(line)); 
     } 
} 
... 

と後にのみ:)

System.out.println(listOfAnswer.toString()); 

簡単な解決策は

を使用することですそれらをプリントアウト:これを扱うの

しかし、正しいの "Java" の方法は、あなたのオブジェクトを作成することです

Map<Integer, LinkedList<String>> answers = new LinkedHashMap<Integer, LinkedList<String>(); 
4

読む。答えをチェックするループの部分の中にprintlnを移動して、各回答/回答値を1回だけ印刷するようにしてください。例えば:

if(line.contains("Answer")) { 
    if (printState != "") { 
     System.out.println(count + " " + blockNum + " " + printState); 
    } 
    ... 
} 

EDIT:また、あなたはあなたが最後の回答/答え値セットを印刷することを確認するために、whileループを終了するときに印刷する必要があります。

1

実例を参照してください。

public void reader(String file) throws FileNotFoundException, 
     IOException { 
    BufferedReader reader = new BufferedReader(new FileReader(file)); 
    String line = ""; 
    while (reader.ready()) { 
     line = reader.readLine(); 
     if (!line.contains("Answer")) { 
      System.out.print(line + "/"); 
     } else { 
      System.out.println(); 
      System.out.print(line + " "); 
     } 
    } 
} 
1

出力の主な問題は、ライン反復ループ内に印刷中であることです(while)。

@Albion answeredに従って、whileの内部で印刷がどこで行われたかを変更できますが、回答状態のEDITには欠陥があり、ループの後に余分な時間を印刷する必要があります。正しい結果を得るために

あなたのケースでは正しい解決策であると考えられるループ内には全く印刷しないという難しい選択肢があります。これを行うには、Stringの代わりにStringBuilderを使うだけで十分です。


私もいくつかの不要な変数を発見しており、欠陥がif(line.contains("Answer"))メソッドを使用しても存在し、それが「回答」の文字列は、オプションのテキストの1の内側に表示された場合、それは真の混乱を取得することです例えば、あなたの結果、:

Answer 1: 
1. This is an apple 
2. Capitalizing Is The Answer! 
3. Something 

ウィル出力:ほとんどのケースで

1 Answer 1: 1. This is an apple/
2 2. Capitalizing Is The Answer! 3. Something 

、動的なパターンを見つけるための最善のアプローチ(それは目を変更するためにあなたは、あるとして電子番号、最後の回答では、 '.'を含む ':'も)パターンマッチャーを使用することです!私はこれを使用しました:if(line.matches("Answer \\d[\\:\\.]"))、まだそれに慣れていない場合は、Pattern Docsを参照してください。String.matches()は、おそらくテキストを処理する際に多用するものです。一つ一つの変化を説明する


は少し面倒で、コードは、あなたがそれを分析した後、あなたが習得のために十分に簡単ですので、私は単に私のアプローチがどうなるか投稿します:

public static void StackAnswer(String file) throws FileNotFoundException, IOException{ 
    BufferedReader br = new BufferedReader(new FileReader(file)); 
    StringBuilder output = new StringBuilder(); 
    int count = 0; 
    while(br.ready()){ 
     String line = br.readLine().trim(); 
     if(line.matches("Answer \\d[\\:\\.]")){ 
      count++; 
      output.append(System.lineSeparator()).append(count).append(' ').append(line); 
     } else { 
      output.append("/").append(line); 
     } 
    } 
    System.out.println(output.toString().trim()); 
    br.close(); 
} 

グッド運!

関連する問題