Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修改";加上「;数组列表的方法?_Java_Arraylist - Fatal编程技术网

Java 如何修改";加上「;数组列表的方法?

Java 如何修改";加上「;数组列表的方法?,java,arraylist,Java,Arraylist,我已经在这个添加方法代码上工作了好几个小时了,我的脑子都想不起来了。。。任何提示/帮助都足够了 我有一个类Bin,它生成BinItems的ArrayList。BinItem类接受字符串SKU及其整数数量。“add”方法在类Bin中应该做的是查看Bin中是否已经存在具有相同SKU的BinItem,如果存在,则会添加数量 这是给我的指示“添加方法的修改版本。我们现在需要按照如下方式操作此方法:当要求添加bin项目b时,它首先检查bin是否已包含与b具有相同SKU的bin项目。如果是,则移除已在箱子中

我已经在这个添加方法代码上工作了好几个小时了,我的脑子都想不起来了。。。任何提示/帮助都足够了

我有一个类Bin,它生成BinItems的ArrayList。BinItem类接受字符串SKU及其整数数量。“add”方法在类Bin中应该做的是查看Bin中是否已经存在具有相同SKU的BinItem,如果存在,则会添加数量

这是给我的指示“添加方法的修改版本。我们现在需要按照如下方式操作此方法:当要求添加bin项目b时,它首先检查bin是否已包含与b具有相同SKU的bin项目。如果是,则移除已在箱子中的箱子项目a,并添加一个新的箱子项目,其数量为a和b数量之和。如果bin中没有此类bin项目,则按照常规方式添加bin项目b。”

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

这是我的银行代码

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;    

    }
}
主代码

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.]

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

我自己没有编译此程序,但根据您的添加方法,我看到了d、 你做错了几件事

  • 您正在为已经等于
    b的列表创建一个新变量
    a
    如果您在列表中循环以比较If
    a=b,
    ,那么当您到达
    a
    元素时,
    If语句将始终返回
    true
  • 您没有在
    ArrayList
    上循环。如果检查If条件,则检查
    变量a
    b
    是否相等,而不是
    myContents
    ArrayList
    本身中的元素
  • 我还没有编译这段代码,但是根据上面的规范,
    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);
            }
        }
    

    编辑:将代码更改为使用迭代器,尽管重复,但仍然没有测试?是的,我尝试删除了其中的一个,但无法删除。我必须澄清,我只能修改类中的某些内容,如以下方法,而不能修改其他类。for循环中的代码看起来非常有用,但是,我尝试了它,它不会添加nything到BinItem编辑以添加不重复的项,我的错!我认为问题在于myContents.size()。bin没有任何内容,因此大小为0。顺便说一句,谢谢!我和holtc都添加了一个新条件,将新的BinItem添加到循环中(但我不知道他为什么有一个额外的参数)。这是可行的,但输出为-0,-1,-2,不像预期的输出那样在-1,-2,-0中,但数组列表包含所有正确的项。我使用for循环,只是因为我更喜欢for循环而不是迭代器。这将为列表中不相等的每个项添加b,而我们只想添加一次,因此else条件不应在e while loop。感谢您的帮助!我还没有学习“迭代器”方法或hasNext(),但它让我对如何创建并在方法中添加ArrayList有了更好的理解。没问题,最好选择一个推荐答案(我们的答案中的任何一个都可以完成所需的工作)。
    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);
        }
    }
    
        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);
            }
        }