2015-08-15 37 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统计)空行 –