如何在 toString 方法中为每个试剂瓶组添加额外的换行符分隔

本文讲解如何修改 java 的 `tostring()` 方法,在每组“row x col y”及其内容后添加双换行符(`\n\n`),确保不同位置的试剂瓶信息清晰分隔,避免输出粘连,并保持代码健壮性与可读性。

在实现 toString() 方法时,若仅对每个非空 Vial 追加单个换行符(\n),会导致相邻两组数据(如 "Row 0 Col 0" 和紧随其后的 "Row 1 Col 5")之间缺少空行,造成视觉混淆和测试失败——正如你遇到的:"...elixirRow 1 Col 5" 这类粘连输出。

根本解决方式是在每组完整输出(即一个 "Row i Col j" 标题 + 其对应 vial.toString() 内容)结束后,统一追加 \n\n,而非依赖 vial.toString() 自身是否含结尾换行。注意:不应在循环末尾无条件加双换行(否则末尾会多出冗余空行),而应确保仅当该位置存在有效 Vial 时才添加分隔空行

以下是优化后的 toString() 实现(使用 StringBuilder 更高效,且避免字符串拼接性能问题):

@Override
public String toString() {
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            Vial vial = rack[i][j];
            if (vial != null) {
                // 输出位置标题 + 换行
                result.append("Row ").append(i).append(" Col ").append(j).append("\n");
                // 输出试剂内容(假设 vial.toString() 不以 \n 结尾;若已含,则需先 trim)
                result.append(vial.toString());
                // 关键:在此处添加双换行作为组间分隔
                result.append("\n\n");
            }
        }
    }
    // 移除末尾多余的双换行(防止结尾多出空行)
    if (result.length() > 0) {
        result.setLength(result.length() - 2); // 安全移除最后两个字符(即 "\n\n")
    }
    return result.toString();
}

关键要点说明:

  • 使用 StringBuilder.append()

    替代 += 提升性能,尤其在大量拼接时;
  • result.setLength(...) 是安全、高效地裁剪末尾冗余换行的方式,比 trim() 更精准(后者会误删首尾空格/制表符);
  • 若 vial.toString() 本身已以 \n 结尾,则当前逻辑会导致三换行(\n + \n\n → \n\n\n)。此时建议统一规范:让 Vial.toString() 不负责结尾换行,由外层 toString() 统一控制格式,增强职责分离;
  • 避免在 if 外加全局换行判断(如“是否为最后一组”),逻辑复杂且易出错;直接“每组后加 \n\n,再整体修剪末尾”更简洁可靠。

最终输出将严格符合测试期望:

Row 0 Col 0
30.5 grams of ice
42.3 grams of sulfur
0.6 grams of silver

Row 3 Col 5
21.0 grams of water

Row 3 Col 7
45.2 grams of water
31.2 grams of elixir

结构清晰,语义明确,轻松通过格式校验。