【问题标题】:How to modify an "add" method of an ArrayList?如何修改 ArrayList 的“添加”方法?
【发布时间】:2014-12-29 05:32:05
【问题描述】:

我已经研究这个添加方法代码几个小时了,我无法理解它......任何提示/帮助就足够了。

我有一个 Bin 类,它生成 BinItems 的 ArrayList。 BinItem 类接受一个 String SKU 及其 int 数量。 Bin类中的“add”方法应该做的是查看Bin中是否已经有一个具有相同SKU的BinItem,如果有,那么它将添加数量。

这里是给我的说明“添加方法的修改版本。我们现在需要这个方法操作如下:当被要求添加一个bin item b时,它首先检查bin是否已经包含一个bin与 b 具有相同 SKU 的项目。如果是,则删除已在 bin 中的 bin 项目 a,并添加一个新的 bin 项目,其数量是 a 和 b 的数量之和。如果没有这样bin item 已经在 bin 中,然后 bin item b 以通常的方式添加。"

我不能修改其他类,我只能修改Bin类中的3个方法:remove、totalQuantity和add。我的主要问题是我不确定如何在 add 方法中创建一个新的 BinItem 来增加数量并删除所有类似的 SKU。

这是我的 Bin 码

public class Bin {
    private String myName;
    private ArrayList<BinItem> myContents;

    public Bin ( String name )
    {
        myName = name;
        myContents = new ArrayList <BinItem>();
    }    

    public ArrayList <BinItem> getContents()
    {
        return myContents;
    }    

    public String getName()
    {
        return myName;
    }

    public void remove (int b)
    {
        myContents.remove(b);
    }

    public int totalQuantity()
    {
       int x = 0;
       for (int i = 0; i< myContents.size(); i++)
       {
           x += myContents.get(i).getQuantity();
       }
       return x;
    }

    public void add ( BinItem b)
    {
        BinItem a = b;
        myContents.add(a);
        for (int x = 0; x < myContents.size(); x++)
        {
            if (a.getSKU().equals(b.getSKU()))
                myContents.remove(a);

        }
    }

    public String toString()
    {
        String s = "Bin " + myName + ":\n";
        for ( BinItem b : myContents ) 
        s += b + "\n"; 
        return s;    

    }
}

BinItem 代码

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();
    }
}

主要代码

public static void main( String[] args )
{
  Bin bin = new Bin( "A" );
  bin.add( new BinItem( "1234-0", 500 ) );
  bin.add( new BinItem( "1234-1", 25 ) );
  bin.add( new BinItem( "1234-0", 243 ) );
  bin.add( new BinItem( "1234-2", 7720 ) );
  bin.add( new BinItem( "1234-0", 871 ) );
  System.out.println( bin );
}

预期结果

Bin A:
SKU 1234-1: 25
SKU 1234-2: 7720
SKU 1234-0: 1614
[The bin items may be listed in a different order.]

【问题讨论】:

  • 是的,我尝试删除那个但不能。我必须澄清一下,我只能修改类中的以下方法之类的东西,而不能修改其他类。

标签: java arraylist


【解决方案1】:
public void add ( BinItem b)
{
    boolean added = false;
    for (int x = myContents.size() - 1; x >= 0; x--)
    {
        BinItem temp = myContents.get(x);
        String sku = temp.getSKU();
        if (sku.equals(b.getSKU())){
            myContents.remove(x);
            int quantityToAdd = temp.getQuantity();
            int bQuantity = b.getQuantity();
            BinItem newItem = new BinItem(sku, quantityToAdd + bQuantity);
            myContents.add(0, newItem);
            added = true;
        }
    }
    if (!added){
        myContents.add(b);
    }
}

这从列表的末尾到开头,并在必要时执行请求的检查和删除。然后它使用组合数量创建新的 BinItem,并将新项目添加到列表的开头,以便再次被搜索命中。

【讨论】:

  • for 循环中的代码看起来很有帮助,但是,我试过了,它不会向 BinItem 添加任何内容
  • 编辑添加了不重复的项目,我的错!
  • 我认为问题出在 myContents.size() 上。垃圾箱还没有任何东西,所以它的大小为 0。顺便谢谢!
  • 我和 holtc 都添加了一个新条件,将一个新的 BinItem 添加到循环中(但是我不知道他为什么有一个额外的参数)。
  • 这行得通,虽然输出为 -0、-1、-2,但不像预期的输出那样在 -1、-2、-0 中,但数组列表包含所有正确的项目。我使用 for 循环,只是因为我更喜欢 for 循环而不是迭代器。
【解决方案2】:

我自己没有编译这个程序,但是从我在你的 add 方法中看到的,你做错了一些事情。

  1. 你正在为你的列表创建一个新变量a,它已经等于b.如果你遍历列表来比较a = b,那么if-statement将总是返回true当你到达你的@ 987654326@element.
  2. 你没有循环你的ArrayList。如果你检查你的if条件,你正在检查variablesab是否相等,而不是myContentsArrayListitself中的元素.

我还没有编译这段代码,但根据上面的规范,add(BinItem) 的修改版本可能如下所示:

    public void add (BinItem b)
    {   
        boolean changed = false;
        Iterator itr = myContents.iterator();
        while(itr.hasNext())
        {
            BinItem bItem = itr.next();
            if (bItem.getSKU() == b.getSKU()) {
                int oldQty = bItem.getQuantity();
                itr.remove();
                myContents.add(new BinItem(b.getSKU(), (b.getQuantity() + oldQty));
                changed = true;
            }  
        }
        if(!changed) {
            myContents.add(b);
        }
    }

编辑:更改代码以使用迭代器,但仍未测试

【讨论】:

  • 当我们只想添加一次时,这将为列表中不相等的每个项目添加 b,因此 else 条件不应该在 while 循环中。
  • 感谢您的帮助!我还没有学习过“迭代器”方法或 hasNext(),但它让我更好地了解了如何在方法中创建添加 ArrayList。
  • 没问题,最好选择推荐的答案(我们的任何一个答案都可以完成所需的工作)。
猜你喜欢
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多