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

动态初始化数组名称:实现按容量分袋的ShoppingBag数组技术求助

问题分析与解决方案

我来帮你梳理下这段代码里的问题,然后给出能正确实现需求的方案~

原代码的核心问题

  • 循环逻辑混乱:内层循环错误地使用了i++(应该是k++),而且循环条件设置不合理,会导致重复处理同一元素甚至数组越界,根本没法遍历完所有商品。
  • 错误的变量命名思路:Java里没办法通过字符串拼接动态生成newBag1、newBag2这类变量名,你试图用bag + index来命名变量的操作是行不通的,得用集合或者动态数组来存储所有购物袋实例。
  • 新袋子未被复用和保存:else分支里创建的newBag1没有被加入到结果集合中,后续也没用来装剩余商品,等于白创建了。
  • 未处理全部商品:外层循环只执行MAXNBAG次,没法保证装完goods数组里的所有物品。
  • 缺少返回值:方法声明要返回ShoppingBag[],但代码里没有任何return语句,编译都过不了。

修正后的代码实现

我们可以用ArrayList来动态管理购物袋,这样能灵活创建新袋子,直到装完所有商品:

import java.util.ArrayList;

public class ShoppingBagPacker {
    // 假设这两个常量是已定义的:每个袋子最多装6个,MAX_NUM_ITEMS=6
    private static final int MAX_NUM_ITEMS = 6;

    public static ShoppingBag[] packIntoBags(GroceryItem[] goods) {
        // 用ArrayList动态存储所有购物袋,方便随时添加新袋子
        ArrayList<ShoppingBag> bagList = new ArrayList<>();
        // 初始化第一个购物袋
        ShoppingBag currentBag = new ShoppingBag();
        bagList.add(currentBag);

        for (GroceryItem item : goods) {
            // 如果当前袋子没装满,就添加物品
            if (currentBag.numItems() < MAX_NUM_ITEMS) {
                currentBag.addToBag(item);
            } else {
                // 当前袋子满了,创建新袋子,加入集合,切换为当前袋子
                currentBag = new ShoppingBag();
                bagList.add(currentBag);
                currentBag.addToBag(item);
            }
        }

        // 将ArrayList转换为ShoppingBag数组返回
        return bagList.toArray(new ShoppingBag[0]);
    }
}

代码说明

  1. 动态管理购物袋:用ArrayList<ShoppingBag>来存储所有袋子,避免提前预估袋子数量的麻烦,有需要就新建。
  2. 遍历所有商品:用增强for循环遍历goods数组里的每一个物品,确保不会遗漏。
  3. 袋子满时自动新建:每次添加物品前检查当前袋子的物品数量,满了就创建新袋子并切换为当前袋子,继续装货。
  4. 正确返回结果:最后把ArrayList转换成符合方法返回类型的ShoppingBag[]数组。

内容的提问来源于stack exchange,提问作者user1815179

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:31:23