【问题标题】:Formatting the output in desired way以所需的方式格式化输出
【发布时间】:2015-08-15 17:51:55
【问题描述】:

以下方法产生输出。 这段代码唯一的问题是,在报告结束后,它在文件中增加了两行,而只需要一个空行。 我尝试了各种组合,但无法继续。

有人可以帮忙吗?

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

}

}

【问题讨论】:

  • 那么在你的 printWriter 中只保留一个 \n...并且在 for 循环之外
  • 这将如何解决问题。该函数检查数组中播放器的名称,如果名称匹配,它将播放器的统计信息写入输出文件。输出应该是
  • \n 是干什么用的?
  • (玩家 1 统计)空行(玩家 2 统计)空行
  • 在两条记录之间添加额外的行

标签: java format report output


【解决方案1】:

如果不是第一次,您应该有条件地在内部 for 循环之前添加一个空行,而不是在内部 for 循环之后无条件地添加一个空行。

另外,你应该在printf 中使用%n 作为换行符,println() 作为空行。您应该将close() 放在finally 块中,或者使用try-with-resources。在此处显示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();
}

【讨论】:

  • 现在更好的建议是使用“尝试资源”而不是使用finally 来结束。
  • @RealSkeptic 是的,但是很多提问的人仍在使用旧版本的 Java,所以没有版本信息,我不想介绍两种方法。
  • 自 2013 年以来 Java 6 已不再受支持,我认为现在使用 Java 7 习语是安全的。
  • 非常感谢。我被困在这里很久了
  • @RealSkeptic 您可能会认为,但我昨天回答了另一个问题,并且确实更改为使用 try-with-resource,结果发现那个人仍在使用 Java 5。我认为重要的部分是 close() 应该始终位于 finally 块中,无论是手动还是使用 try-with-resources。
【解决方案2】:

因为你在使用新行

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

所以你可以跳过

printWriter.print("\n");

【讨论】:

  • 这应该是输出(玩家 1 统计)空行(玩家 2 统计)空行
【解决方案3】:

您可以将 if 语句包裹在打印换行符的行周围,以检查 row 是否小于 data.length。此外,您可以使用println() 代替print("\n")。

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

【讨论】:

  • 如果最后一行的if 语句为假,那将无法正常工作。
  • 问题不是要求在最后只打印一个新行吗?
  • @RealSkeptic 那么row 在上次迭代中没有增加吗?
  • 我明白了。我想我会编辑答案只是为了防止与未来的读者混淆:)
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多