我已经在这个程序上工作了几个小时,并且已经解决了几乎所有其他课程中出现的错误。然而,这个,我似乎可以修复接收方法。接收方法应首先检查(通过比较SKU)传入产品是否已在myCatalog中。如果没有,请将产品(通过其SKU)添加到目录中。在那之后,无论如何 - 只要还有一些传入的产品还没有被放入垃圾箱 - 我想找到哪个垃圾箱包含的总数量最少。 (如果所有垃圾箱已满,请添加一个新的空垃圾箱)我将该特定产品添加到该垃圾箱,直到垃圾箱已满 - 此时我会重复 - 或者我用完了产品。重复此过程,直到不再有进入的产品为止。
public class Warehouse
{
private int myBinMax;
private ArrayList<MusicMedia> myCatalog;
private ArrayList<Bin> myBins;
public Warehouse( int binMax )
{
myBinMax = binMax;
myCatalog = new ArrayList<MusicMedia>();
myBins = new ArrayList<Bin>( 5 );
}
public String toString()
{
return Tester.detailedInventory(myCatalog,myBins);
}
public void addBin()
{
myBins.add( new Bin( "B" + myBins.size() ) );
}
public void receive( MusicMedia product, int quantity )
{
boolean contained = false;
int lowestAmount = myBinMax,
leastFullBinIndex,
i,
insertQuantity;
for(MusicMedia entry : myCatalog)
{
if(entry.getSKU().equals(product.getSKU()))
{
contained = true;
}
}
if(!contained)
{
myCatalog.add(product);
}
while(quantity > 0)
{
lowestAmount = myBinMax;
for(i = 0; i < myBins.size(); i++)
{
if(myBins.get(i).totalQuantity() < lowestAmount)
{
lowestAmount = myBins.get(i).totalQuantity();
leastFullBinIndex = i;
}
if((i == myBins.size() - 1 && lowestAmount == myBinMax)||(myBins.size() == 0))
{
myBins.add(new Bin("bin" + Integer.toString(i)));
}
}
if(quantity >= myBinMax - lowestAmount)
{
insertQuantity = myBinMax - lowestAmount;
}
else
{
insertQuantity = quantity;
}
quantity -= insertQuantity;
myBins.get(i).add(new BinItem(product.getSKU(), insertQuantity));
}
}
}
在我上次编辑之前,没有任何内容可以打印 - 只是一个空白的控制台 - 但是为了解决这个问题,我添加了这个(也包含在上面的代码中):
if((i == myBins.size() - 1 && lowestAmount == myBinMax)||(myBins.size() == 0))
{
myBins.add(new Bin("bin" + Integer.toString(i)));
}
现在,在没有给我错误的情况下它不会运行:
java.lang.IndexOutOfBoundsException
Index: 0, Size 0 (in java.util.ArrayList)
以及突出显示以下内容:
myBins.get(i).add(new BinItem(product.getSKU(), insertQuantity));
这里列出了为这个巨大程序创建的各种类:
MusicMedia有三个私有变量,但这里唯一有变量的是String mySKU,由getSKU()获取
Bin有一个私有的String,name,它也是唯一的参数,以及一个BinItem类的私有ArrayList。为了从另一个类访问BinItems的这个ArrayList,你可以使用getContents()。它还有方法totalQuantity(),它返回已经在bin中的对象的总数量。
BinItem有私有变量mySKU(String)和myQuantity(int)以及方法getSKU()和getQuantity(),它们都是该顺序的参数
答案 0 :(得分:1)
首先,你没有垃圾箱。
您的“for”块被跳过,因为大小为零;
所以我们到了“while”循环的最后一行,然后执行myBins.get(i)...... 这是我们得到错误的地方,因为我们无法在索引0处获取bin,因为我们根本没有垃圾箱。
问题是我们在没有添加任何垃圾箱的情况下达到了这行代码......
我不确定你是否意识到,下面这行不能用5个箱子启动你的程序。
myBins = new ArrayList<Bin>( 5 );
此代码中的5设置数组的内部缓冲区以容纳5个项目。如果我们没有提供数字,那么它将从10开始。但是这些数字只是为了让程序员能够控制存储器的数量。
如果你的目标是从5个箱子开始,你应该做如下的事情:
myBins = new ArrayList<Bin>( 5 );
for(int i=0; i<5; i++){
myBins.add(new myBin());
}