
本文讲解如何修改 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
结构清晰,语义明确,轻松通过格式校验。










