2015-08-15 47 views
1

以下方法產生輸出。 這段代碼唯一的問題是,在報告結束後,它會向文件中添加兩行額外的行,而需要的只是一行空行。 我已經嘗試過各種組合,但仍然可以繼續。以所需的方式格式化輸出

有人可以幫忙嗎?

private static void save_player_info(String[][] data, String player) { 
    player=player.toLowerCase(); 
    try { 
     PrintWriter printWriter= new PrintWriter(new File("out4.txt")); 
     for(int row=1;row<data.length;row++){ 
      String playerName=data[row][0].toLowerCase(); 
      if(playerName.indexOf(player)!=-1){ 
       String[] fields=data[0]; 
       String[] values=data[row]; 
       for (int i=0;i<fields.length;i++){ 
        printWriter.printf("%21s : %s\n",fields[i],values[i]); 
       } 

       printWriter.print("\n"); 

      } 
     } 

     printWriter.close(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

} 

}

+0

然後只保留一個\ n在你的PrintWriter ...外的for循環 – Garry

+0

如何是要解決問題的。該函數檢查數組中玩家的名字,如果名字匹配,則將輸出文件中玩家的屬性寫入。輸出應該是 –

+0

\ n用於什麼? – Garry

回答

3

相反的內for循環後無條件地添加一個空行,你應該有條件內for循環之前,添加一個空行,如果不是第一次。

此外,您應該使用%nprintf換行符,和println()爲空行。您應該將close()放在finally區塊中,或者使用試用資源。此處顯示finally塊解決方案以實現Java版本獨立性。

PrintWriter printWriter= new PrintWriter(new File("out4.txt")); 
try { 
    boolean first = true; 
    for(int row=1;row<data.length;row++){ 
     String playerName=data[row][0].toLowerCase(); 
     if(playerName.indexOf(player)!=-1){ 
      String[] fields=data[0]; 
      String[] values=data[row]; 
      if (first) 
       first = false; 
      else 
       printWriter.println(); 
      for (int i=0;i<fields.length;i++){ 
       printWriter.printf("%21s : %s%n",fields[i],values[i]); 
      } 
     } 
    } 
} finally { 
    printWriter.close(); 
} 
+0

現在更好的建議是使用「試用資源」而不是使用「finally」來結束。 – RealSkeptic

+0

@RealSkeptic真的,但很多人提出的問題仍然使用舊版本的Java,所以沒有版本信息,我不想涵蓋兩種實現方法。 – Andreas

+0

自從2013年Java 6已經不支持,我認爲現在使用Java 7成語是安全的。 – RealSkeptic

0

你可以用的,如果周圍打印一個換行符,以檢查是否row小於data.length行語句。此外,您可以使用println()而不是print("\n")

for(int row=1;row<data.length;row++){ 
    ... 
    if(row < data.length - 1){ 
     printWriter.println(); 
    } 
} 
+0

如果最後一行的if語句爲false,那麼這將無法正常工作。 – Andreas

+0

這個問題不要求只在最後打印一個新行嗎? – deezy

+0

@RealSkeptic那麼在上一次迭代中'行'不會增加? – deezy

0

由於您使用的新生產線在

printWriter.printf("%21s : %s\n",fields[i],values[i]); 

那麼你可以跳過

printWriter.print("\n"); 
+0

這應該是輸出 (玩家1統計)空行(玩家2統計)空行 –