You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:00:55