#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
более коротким способом.