Java如何格式化未知数量字符串实现每行三个逗号分隔显示?
文本冒险游戏背包显示的格式化问题
我开发一款文本冒险游戏,用ArrayList存储背包物品,编写displayInventory方法在控制台打印背包内容。当前代码如下:
public void displayInventory() { StringBuilder result = new StringBuilder("Inventory: \n"); String format = ("%s, %s, %s %n"); for (int i=0; i< inventory.size(); i++) { result.append(inventory.get(i)); } //String result = String.join(",", inventory); System.out.format(format, result.toString());; }
原本想结合StringBuilder实现格式化,现在遇到新问题:设置了每行显示3个物品的格式,但测试只有2个物品时抛出异常:
Inventory: Small BottleLarge Bottle, Exception in thread "main" java.util.MissingFormatArgumentException: Format specifier '%s' at java.base/java.util.Formatter.format(Formatter.java:2688) at java.base/java.io.PrintStream.format(PrintStream.java:1209) at wonderland/gameObjects.Player.displayInventory(Player.java:41) at wonderland/gameObjects.Test.main(Test.java:19)
想问是否需要判断物品数量是否为3的倍数,使用不同的打印语句?有没有办法格式化数量可变的字符串?玩家物品数量随时变化(比如拾取3个、使用1个后再拾取2个),需要适配任意数量的显示。
解决方案
你的错误根源很明确:format字符串定义了3个%s占位符,但你只传入了1个参数(result.toString()),不管物品数量是多少,都会因为参数数量不匹配报错,和物品是不是3个无关。
要实现每行显示3个物品的需求,不需要硬写固定数量的格式化规则,可以用更灵活的方式处理:
方式一:用StringBuilder动态拼接
遍历物品时,逐个添加并处理分隔符,每3个物品自动换行:
public void displayInventory() { StringBuilder result = new StringBuilder("Inventory: \n"); for (int i = 0; i < inventory.size(); i++) { // 添加当前物品 result.append(inventory.get(i)); // 非最后一个物品,添加逗号分隔 if (i != inventory.size() - 1) { result.append(", "); } // 每3个物品换行(最后一行不足3个也无需额外处理) if ((i + 1) % 3 == 0) { result.append("\n"); } } System.out.println(result.toString()); }
方式二:按批次分组处理
直接按每3个物品为一组,用String.join拼接每组内容后打印:
public void displayInventory() { System.out.println("Inventory: "); // 每次处理3个物品,直到遍历完所有物品 for (int i = 0; i < inventory.size(); i += 3) { // 确定当前组的结束索引(避免越界) int endIndex = Math.min(i + 3, inventory.size()); // 拼接当前组的物品为逗号分隔的字符串 String lineContent = String.join(", ", inventory.subList(i, endIndex)); // 打印当前行 System.out.println(lineContent); } }
这两种方式都能完美适配任意数量的背包物品,自动处理每行3个、最后一行不足3个的场景,不需要额外判断物品数量是否为3的倍数。
内容的提问来源于stack exchange,提问作者Justice Brinston
相关产品推荐
相关产品推荐

