动态初始化数组名称:实现按容量分袋的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]); } }
代码说明
- 动态管理购物袋:用
ArrayList<ShoppingBag>来存储所有袋子,避免提前预估袋子数量的麻烦,有需要就新建。 - 遍历所有商品:用增强for循环遍历
goods数组里的每一个物品,确保不会遗漏。 - 袋子满时自动新建:每次添加物品前检查当前袋子的物品数量,满了就创建新袋子并切换为当前袋子,继续装货。
- 正确返回结果:最后把ArrayList转换成符合方法返回类型的
ShoppingBag[]数组。
内容的提问来源于stack exchange,提问作者user1815179
相关产品推荐
相关产品推荐

