0

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
.... 

私がやりたいのは、それらを2つの項目に分けることです。1つは回答番号です。もう1つは回答のリストです。

したがって、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 / 
4

4 に答える 4

4

読み取った入力行ごとに出力行を印刷しています。回答をチェックするループの部分内でprintlnを移動して、各回答/回答値セットが1回だけ印刷されることを確認してください。例えば:

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

編集:最後の回答/回答値セットを確実に印刷するために、whileループを終了するときにも印刷する必要があります。

于 2012-05-11T18:34:34.920 に答える
1

主な出力の問題は、行反復ループ内で印刷していることです(while)。

それを解決するには、@ Albionが回答した内容に従い、印刷が内部で行われる場所を変更できますwhileが、彼の回答のEDITに欠陥があり、ループの後に余分な時間を印刷する必要があります。正しい結果を得る。

別の難しい方法があります。それは、ループ内にまったく印刷しないことです。これは、あなたの場合の正しいアプローチであると私は考えています。これを行うには、Stringの代わりにStringBuilderを使用するだけです。


また、いくつかの不要な変数を見つけました。また、メソッドの使用にも欠陥がありますif(line.contains("Answer"))。つまり、オプションテキストの1つに「回答」文字列が含まれていると、trueが返され、結果が混乱します。たとえば、次のようになります。

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[\\:\\.]"))、そしてまだ慣れていない場合は、テキストを処理するときにおそらくよく使用するものであるように、パターンドキュメントを参照してください。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();
}

幸運を!

于 2012-05-11T20:14:38.777 に答える
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を持つことができます。

しかし、これを処理する正しい「java」の方法は、オブジェクトを作成することです。

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());

より簡単な解決策は、

Map<Integer, LinkedList<String>> answers = new LinkedHashMap<Integer, LinkedList<String>();
于 2012-05-11T18:44:01.970 に答える
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 + " ");
        }
    }
}
于 2012-05-11T18:58:12.883 に答える