有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java仅在达到限制时向arraylist添加新元素

我正在尝试为warehouse类编写receive()方法,但没有显示我想要的结果。主要方法是:

public static void main( String[] args )
{
    Warehouse w = new Warehouse( 10 ); 
    Footwear d0 = new DressShoe( "Loafer", 10.5, "1234-13" ); 
    Footwear b = new Boot( "Riding", 8, "1234-5" ); 
    Footwear c = new CasualShoe( "Sandal", 9.5, "1234-0" ); 
    Footwear d1 = new DressShoe( "Wing-tip", 10, "1234-3" ); 
    w.receive( d0, 4 ); 
    w.receive( b, 25 ); 
    w.receive( c, 18 ); 
    w.receive( d1, 5 ); 
    System.out.println(w);
}

我想让it打印出来,每个箱子的总数量应该只有10个(数量是最右边的数字)

Bin B0:
Dress Shoe – Loafer (size 10½), SKU 1234-13: 4
Casual Shoe – Sandal (size 9½), SKU 1234-0: 6
Bin B1:
Boot – Riding (size 8), SKU 1234-5: 10
Bin B2:
Boot – Riding (size 8), SKU 1234-5: 10
Bin B3:
Boot – Riding (size 8), SKU 1234-5: 5
Casual Shoe – Sandal (size 9½), SKU 1234-0: 2
Dress Shoe – Wing-tip (size 10), SKU 1234-3: 3
Bin B4:
Casual Shoe – Sandal (size 9½), SKU 1234-0: 10
Bin B5:
Dress Shoe – Wing-tip (size 10), SKU 1234-3: 2

但我的书除了“礼服鞋-休闲鞋(尺寸10½)”外没有其他印刷品,而且当总量为10时,它也不会创建新的箱子。我的看起来就像

Bin B0:
Dress Shoe - Loafer (size 10½), SKU 1234-13: 52
Bin B1:
Dress Shoe - Loafer (size 10½), SKU 1234-13: 48
Bin B2:
Dress Shoe - Loafer (size 10½), SKU 1234-13: 23
Bin B3:
Dress Shoe - Loafer (size 10½), SKU 1234-13: 5
Bin B4:

到目前为止,这些是我的课程

public class Warehouse
{
private int myBinMax;
private ArrayList<Footwear> myCatalog;
private ArrayList<Bin> myBins;

public Warehouse(int binMax)
{
    myBinMax = binMax;
    myCatalog = new ArrayList<Footwear>();
    myBins = new ArrayList<Bin>(5);
    for(int i=0; i<5; i++)
    {
        addBin();
    }
}
public void addBin()
{
    myBins.add( new Bin( "B" + myBins.size() ) );
}
public String toString()
{
    String s = "";
    for ( Bin bin : myBins )
    {
        s += "Bin " + bin.getName() + ":\n";
        for (int i = 0; i < bin.getContents().size(); i++) {
            s += Lab04Runner.lookupFootwear(myCatalog, 
          bin.getContents().get(i).getSKU()) + ", " + 
          bin.getContents().get(i) + "\n";
        }
    }
    return s;
}
public void receive(Footwear object, int a)
{
    if (!myCatalog.contains(object))
    {
        myCatalog.add(object);
    }
    int min = Integer.MAX_VALUE;
    String name;
    for (Bin bin : myBins)
    {
        for( int i =0; i<myCatalog.size(); i++)
        {
        if (bin.totalQuantity() < min)
        {
            if (bin.totalQuantity() == 0)
            {
                min = 0;
                name = bin.getName();
                BinItem bi = new BinItem(myCatalog.get(i).getSKU(), a);    
                bin.add(bi);
            }
            else
            {
                min = bin.totalQuantity();
                name = bin.getName();
                BinItem bi = new BinItem(myCatalog.get(i).getSKU(), a);    
                bin.add(bi);
            }
            if (bin.totalQuantity() == myBinMax)
            {
                addBin();
                name = myBins.get(myBins.size() - 1).getName();
                BinItem bi = new BinItem( myCatalog.get(i).getSKU(), 
                  a);
                myBins.get(myBins.size()-1).add(bi);
            }
        }
    }
    }
}
}

public class Lab04Runner
{
public static String lookupFootwear( ArrayList<Footwear> catalog, 
String sku )
{
    int n = Integer.parseInt(sku.replace("-", ""));
    for ( Footwear fw : catalog )
    {
        if (n <= 123499 && n >= 12340)
        {
            return "" + fw;
        }
    }

    return "SKU " + sku + " not in catalog";
}

public class Footwear
{
private String myStyle;
private double mySize;
private String mySKU;
public Footwear(String s, double r, String k)
{
    myStyle = s;
    mySize = r;
    mySKU = k;
}
public String getStyle()
{
    return myStyle;
}
public double getSize()
{
    return mySize;
}
public String getSKU()
{
    return mySKU;
}
public String getType()
{
    return "Unspecified";
}
public String printSize()
{
    if (mySize - (int)mySize == 0)
    {
        return "" +(int)mySize;
    }
    else
    {
        return "" +(int)mySize + "\u00bd";
    }
}    
public String toString()
{
    return getType() + " - " + getStyle() + " (size " + printSize() + 
")";
}
public class Bin
{
private String myName;
private ArrayList<BinItem> myContents;

public Bin( String name )
{
    myName = name;
    myContents = new ArrayList<BinItem>();
}
public String getName() 
{
    return myName; 
}
public ArrayList<BinItem> getContents()
{
    return myContents;
}
public void remove( int i )
{
    myContents.remove( i );
}
public int totalQuantity()
{
    int total = 0;
    for ( BinItem b : myContents )
    {
        total += b.getQuantity();
    }
    return total;
}
public void add( BinItem b )
{
    String sku = b.getSKU();
    int n = b.getQuantity();
    BinItem item;
    for ( int i = 0; i < myContents.size(); i++ )
    {
        item = myContents.get( i );
        if ( sku.equals( item.getSKU() ) )
        {
            int m = item.getQuantity();
            myContents.remove( i );
            myContents.add( new BinItem( sku, m+n ) );
            return;
        }
    }

    myContents.add( b );
}
public String toString()
{
    String s = "Bin " + myName + ":";
    for ( BinItem b : myContents )
    {
        s += "\n" + b;
    }
    return s;
}
public class BinItem
{
private String mySKU;
private int myQuantity;

public BinItem(String sku, int quantity)
{
    mySKU = sku;
    myQuantity = quantity;
}

public String getSKU()
{
    return mySKU;
}

public int getQuantity()
{
    return myQuantity;
}

public String toString()
{
    return "SKU " + getSKU() + ": " + getQuantity();
}  
}

我如何阻止它添加,而是向arraylist添加一个新元素?还有,我如何让它打印其他对象,而不仅仅是第一个对象


共 (1) 个答案

  1. # 1 楼答案

    您没有计算可以放入垃圾箱的剩余物品。您总是添加所有项目。因此,一个解决方案是将这些物品平均添加到现有的垃圾箱中。当仍有剩余的项目时,您必须添加另一个bin,并再次调用receive方法将剩余的项目添加到新的bin

    public void receive(Footwear object, int a) {
        if (!myCatalog.contains(object)) {
            myCatalog.add(object);
        }
        int amountOfRemainingItems = 0;
        amountOfRemainingItems = distributeEqually(object, a);
        if(amountOfRemainingItems > 0) {
            addBin();
            receive(object, amountOfRemainingItems);
        }
    }
    
    private int distributeEqually(Footwear object, int amountOfRemainingItems) {
        for (Bin bin : myBins) {
            if(amountOfRemainingItems == 0) {
                break;
            }
            if (bin.totalQuantity() < myBinMax) {
                int itemsToAdd = calculateItemsToAdd(bin, amountOfRemainingItems);
                amountOfRemainingItems -= itemsToAdd;
                BinItem bi = new BinItem(object.getSKU(), itemsToAdd);
                bin.add(bi);
            } 
        }
        return amountOfRemainingItems;
    }
    
    private int calculateItemsToAdd(Bin bin, int amountOfremainingItems) {
        return (myBinMax - bin.totalQuantity()) >= amountOfremainingItems ? amountOfremainingItems : 
            myBinMax - bin.totalQuantity();
    }
    

    我认为可能有一个更快的更好的解决方案,因为您每次都迭代所有的箱子。但这可能是你可以建立的第一个解决方案