Как мне исправить метод AddToCart класса?

#java #arrays #object #aggregator

#java #массивы #объект #агрегатор

Вопрос:

Мне нужно создать код для метода AddToCart, чтобы добавить элемент в список элементов. Я рассмотрел другие проблемы с ShoppingCart здесь, но я не вижу ни одной, которая увеличивает количество товара и проверяет название товаров, чтобы увидеть, есть ли оно в массиве… Проблема в том

1) если элемент с именем, переданным в параметре, уже существует в списке элементов, обновите количество этих элементов, увеличив его на переданное количество.

2) если в ItemList нет имени элемента и есть место для нового элемента, создайте новый объект item с заданным именем, количеством и ценой, переданными в качестве параметра, обновите numItems на 1.

3) оба случая должны возвращать значение true.

4) если элемента с заданным именем не было в массиве, и массив не имеет емкости, метод должен возвращать false…

5) завершите метод dispay, чтобы распечатать название, общую цену и количество каждого элемента в списке элементов

Я создал метод getItemIndex и не уверен, нужно ли мне использовать его в этом методе. Поскольку я рассмотрел другие методы AddToCart, я думаю, что этот отличается.

Я попробовал цикл for, и он не вернул то, что я хотел, поэтому я создал новые объекты, но я не могу заставить объекты оставаться содержащимися в массиве объектов.

Класс элементов

 public class Items{
    private String name;
    private double price;
    private int quantity;

    public Items (String n, double p, int q){
        name = n;
        price = p;
        quantity = q;
    }
    public double getPrice(){
        return price;
    }
    public String getName(){
        return name;
    }
    public int getQuantity(){
        return quantity;
    }
    public void addQuantity(int amt){
        int newQuantity = amt   quantity;
        quantity = newQuantity;
    }
    public String toString(){
        return "item name: "   name   ", item quantity: "   quantity   
        ", total price: "   (price * quantity);
    }
}
  

Класс ShoppingCart

 public class ShoppingCart{

    //TODO: declare a cart of Items
    private Items[] itemList;
    //TODO: declare the number of distinct items in the cart
    private int numItems = 0;
    private static final int INITIAL_CAP = 5; // the initial size of the cart
    private static final int GROW_BY=3;


    // ---------------------------------------------------------
    // Creates an empty shopping cart with a capacity for 5 items.
    // ---------------------------------------------------------
    public ShoppingCart(){
        itemList = new Items[INITIAL_CAP];
        numItems = 0;
    }
    public double getTotalPrice(){
        double totalPrice = 0;
        numItems = 0;
        for(int i = 0; i<itemList.length; i  ){
            if(itemList[i]!= null){
                totalPrice = totalPrice   (itemList[i].getQuantity()*itemList[i].getPrice());
                numItems  ;
            }
        }
        return totalPrice;
    }
    private int getItemIndex(String nameOfItem){
    for(int i = 0; i < itemList.length; i  ){
        if(itemList[i].getName().equals(nameOfItem))
            return i;
        }
        return -1;
    }
    public boolean addToCart(String name, double price, int quantity){
        Items n = new Items (name, price, quantity);

        if(numItems == INITIAL_CAP)
            return false;
        itemList[numItems]=n;
        if(itemList[numItems].getName().equals(name)){
            quantity = quantity   1;
            return true;
        }
        else if (!itemList[numItems].getName().equals(name)){
            numItems = numItems   1;
            return true;
        }

        return false;
    }
    public String display(){

        for(int i = 0; i<numItems; i  ){
            System.out.println(itemList[i].toString());

        }
        return toString();

    }
}
  

Результат должен помещать элементы в массив и оставаться содержащимся там, поэтому, когда я вызываю его в своем основном методе, он останется в массиве, и он должен печатать так, когда я его вызываю

молоко $ 3,00 1 $ 3,00
яйца $ 3,00 1 $ 3,00

и т.д… Это будет напечатано в моем методе моделирования, но я не могу понять, как заставить товары оставаться в корзине.

Ответ №1:

Здесь есть пара проблем. Во-первых, вы настраиваете, itemList[numItems] прежде чем даже проверить, существует ли имя переданного элемента addToCart в списке элементов. Во-вторых, вы не проверяете весь список, вы проверяете только элемент по индексу numItems , который в этом случае всегда будет иметь значение true, поскольку вы устанавливаете itemList[numItems] для нового элемента, прежде чем проверять, существует ли имя. Чтобы решить эту проблему, я бы предложил запустить цикл for от i = 0 до numItems и проверить наличие имени нового элемента. Как только вы подтвердите, что он не существует, добавьте новый элемент и увеличьте его numItems . Однако, если элемент уже существует, обновите количество и верните. Наконец, проверка того, заполнен ли список элементов, должна быть выполнена после того, как вы повторили весь список, чтобы увидеть, существует ли элемент уже. Причина этого в том, что вам нужно обновить существующие количества элементов, даже если список полон. Поэтому, прежде чем пытаться добавить новый элемент, вы должны проверить, достаточно ли места в списке.

 public boolean addToCart(String name, double price, int quantity){
    Items n = new Items (name, price, quantity);

    for(int i = 0; i < numItems; i  ){
        if(itemList[i].getName().equals(name)) {
            itemList[i].quantity  = quantity;
            return true;
        }
    }

    if(numItems == INITIAL_CAP)
        return false;

    itemList[numItems] = n;
    numItems  = 1;
    return true;
}
  

Комментарии:

1. Спасибо! это сработало. только одна вещь, что означает =

2. @TBrown нет проблем, = используется, когда вы хотите записать что-то вроде numItems = numItems 1 более коротким способом.