【问题标题】:Change value of arraylist field where object exists更改对象存在的arraylist字段的值
【发布时间】:2020-09-21 15:40:12
【问题描述】:

我需要一些帮助,因为我被卡住了。我有一个名为 orderList 的 ArrayList,类型为 ItemOrdered(int quantity,Item item)。我想为给定项目存在的项目数量设置一个新值到 ArrayList 中。我尝试了所有方法,但没有成功。

//place new order from buyer class
    public void placeOrder(int quantity, Item item) {
        //ItemOrdered newitemordered = new ItemOrdered(quantity,item );
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.addItemOrdered(quantity,item);

    }
//call placeOrder method
buyer.placeOrder(quantity,eshop.ItemListPen.get(x));
import java.util.ArrayList;

public class ShoppingCart {
    public ArrayList<ItemOrdered> orderList = new ArrayList<ItemOrdered>();


    public void addItemOrdered(int quantity,Item item) {
        if(item.getStock() >= quantity && (!item.equals(orderList))){
            ItemOrdered newitemordered = new ItemOrdered(quantity,item);
            orderList.add(new ItemOrdered(quantity,item));
        }else if(item.getStock() < quantity){
            System.out.println("Sorry,this quantity is not available in stock.");
        }else{

            orderList.get(item).setQuantity(quantity);
            System.out.println("nothing");
        }

    }

}
public class ItemOrdered {
    static  Item item;
    private  int quantity;
    public ItemOrdered(int quantity, Item item){
        this.quantity=quantity;
        this.item=item;
    }

    public void setQuantity(int x){
        quantity=quantity + x;
    }

}



【问题讨论】:

  • 小心.add(new ItemOrdered,你实际上已经在那里制作了2个不同的对象(参见前面的行)

标签: java object arraylist reference set


【解决方案1】:

当库存大于或等于数量时,您似乎总是要进入if-else if-elseif 块,因为第二个条件(!item.equals(orderList)) 将为真。这个条件应该检查​​列表是否包含项目,而不是列表和项目是否相等。下一个难题是orderList 中的对象是ItemOrdered 对象而不是Item 对象。在这种情况下,只需执行!orderList.contains(item) 也将始终返回 true。

您可以通过将包含Item 对象的列表作为ShoppingCart 的一部分来解决此问题,或者添加一个新方法来循环遍历orderList 并针对列表中的每个Item 检查item

选项 #1 - 将 Item 对象的新列表添加到 ShoppingCart

public class ShoppingCart {
    public ArrayList<ItemOrdered> orderList = new ArrayList<ItemOrdered>();

    // This could also be public if you needed for some reason, but you could also achieve that by adding getter and setter methods
    // depending on version of Java, you may need to include Item in <> when creating the new list: new ArrayList<Item>()
    private ArrayList<Item> itemsInCart = new ArrayList<>(); 

    public void addItemOrdered(int quantity,Item item) {
        if(item.getStock() >= quantity && !itemsInCart.contains(item)){
            ItemOrdered newitemordered = new ItemOrdered(quantity,item); // this could be removed, and you just create the new ItemOrdered within .add() on the next line
            orderList.add(newitemordered);
            itemsInCart.add(item); // have to update the new list of items
        }else if(item.getStock() < quantity){
            System.out.println("Sorry,this quantity is not available in stock.");
        }else{
            orderList.get(item).setQuantity(quantity);
            System.out.println("nothing");
        }

    }

}

选项 #2 - 遍历 orderList:

public class ShoppingCart {
    public ArrayList<ItemOrdered> orderList = new ArrayList<ItemOrdered>();

    public void addItemOrdered(int quantity,Item item) {
        if(item.getStock() >= quantity && !isItemInCart(item)){
            orderList.add(new ItemOrdered(quantity,item));
        }else if(item.getStock() < quantity){
            System.out.println("Sorry,this quantity is not available in stock.");
        }else{
            orderList.get(item).setQuantity(quantity);
            System.out.println("nothing");
        }

    }

    private boolean isItemInCart(Item item){
        for(ItemOrdered itemOrdered : orderList){
            if(itemOrdered.getItem().equals(item)){
                return true;
            }
        }
        // Item is not in cart
        return false;
    }

}
public class ItemOrdered {
    static  Item item;
    private  int quantity;
    public ItemOrdered(int quantity, Item item){
        this.quantity=quantity;
        this.item=item;
    }

    public void setQuantity(int x){
        quantity=quantity + x;
    }

    public Item getItem(){
        return this.item;
    }

}

关于不同选项的说明:

  • 选项 1:
    • 简单
    • 必须维护第二个列表
  • 选项 2:
    • 需要更多的前期工作
    • 您不必维护两个包含相似数据的列表
    • 如果 orderList 非常大(对于大多数实际情况可能不是什么大问题),循环可能会很昂贵
    • 您可能希望覆盖 Item.equals() 方法,以准确定义要比较的内容以确定两个项目是否相等

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2018-06-09
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多