2012-05-11 84 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 
.... 

我想要做的就是他們分成兩個項目: 一個是回答數字;另一個是答案列表。

因此,假設我有一個對象類叫做答案: 答案號字符串 回答列表。

這是我迄今所做的調試我的代碼,我把它放到對象類之前。但我無法得到正確的結果

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

一個解決方案使用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 
    } 
    ...  

在同時結束加入少許額外打印對最後的答案

這樣你可以有幾個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>(); 
4

要打印一行輸出,輸入的每一行你讀。嘗試在檢查答案的循環部分內移動println,以確保只打印每個答案/答案值集合一次。例如:

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

編輯:當您退出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

主要輸出的問題是,你的行迭代循環(而)內打印。

爲了解決這個問題,你可以遵循什麼@Albion answered和改變,其中印刷是while內部完成,但對他的回答狀態的編輯,有一個缺陷,你將有循環後打印一個額外的時間,以獲得正確的結果。

還有一個可選的難題,那就是不打印在循環內部,我認爲這是您的案例中的正確方法。要做到這一點,你需要的不僅僅是使用StringBuilder而不是String!


我也發現了一些不必要的變量,也有在使用if(line.contains("Answer"))方法的缺陷,那就是,如果「答案」字符串顯示裏面的選項文本之一,它會得到一個真正的和混亂你的結果,例如:

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 

在大多數情況下,尋找一個動態的圖案(如你的是,它改變了個最好的辦法e編號,在上一個答案中,':'與'.'也是)使用(模式)匹配器!我使用這個: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(); 
} 

好運氣!

相關問題