Использование ArrayList в Java - PullRequest
0 голосов
/ 27 марта 2011

Я сделал ArrayList типа CartItem, в основном он хранит все CartItems в одном списке.

Теперь, когда CartItem уже добавлен, вместо того, чтобы снова добавить тот же CartItem, он увеличит его количество на единицу, вместо того, чтобы снова добавить элемент в список.

public ArrayList<CartItem> Items = new ArrayList<CartItem>();
public void AddItem(int productId)
{

    CartItem newItem = new CartItem(productId);

    if (Items.equals(newItem))
    {
        System.out.println("equal");
        for (CartItem item:Items)
        {
            if (item.Equals(newItem))
            {

                item.Quantity++;
                return;
            }
       }
   }
    else
   {
        newItem.Quantity = 1;
        Items.add(newItem);
   }
}

Конструктор CartItem выглядит следующим образом

публичный CartItem (int productId) {

    this.ProductId = productId;
    this.prod = new Product(productId);
    this.Quantity =1;
}

Вместо показа, Книги, 3 его показ Книги 1, Книги 1, Книги 1

Функция CartItem.Equals (Object)

public boolean Equals(CartItem item)
    {
      if(item.prod.Id == this.prod.Id)
      {
           return true;
      }
      return false;
     }

Ответы [ 9 ]

4 голосов
/ 27 марта 2011

Без кода мы мало что можем сделать.Но вот несколько указателей:

  1. Переопределить equals() и hashcode() в вашем CartItem классе.
  2. Используйте универсальный ArrayList<CartItem> вместо необработанного типа.

Возможная версия ваших необходимых методов equals () может быть:

public boolean equals(Object obj)
    {
        if (obj == null)
        {
            return false;
        }
        if (getClass() != obj.getClass())
        {
            return false;
        }
        final CartItem other = (CartItem) obj;

        if (this.prodID != other.prodID)
        {
            return false;
        }
        return true;
    }
3 голосов
/ 27 марта 2011

Посмотрите, что вы сравниваете:

ArrayList<CartItem> Items = new ArrayList<CartItem>();
CartItem newItem = new CartItem(productId);
if (Items.equals(newItem))

Items (объект ArrayList) никогда не равен newItem (объект CartItem)

изм: Что вы должны сделать, это:

  1. Изменить Items.equals (newItem) на Items.contains (newItem)
  2. Ваш рейтинг в CartItem неверен, замените его на что-то вроде этого:

Я сохранил ваше имя, но оно неверно:)

public boolean equal(CartItem item) {
    if (!(item instanceof CarItem)) {
        return false;
    }

    return item.itm.Id == itm.Id;
}
2 голосов
/ 27 марта 2011

Ваш класс ShoppingCart должен быть таким:

   public ShoppingCart{

        ArrayList<CartItem> Items = new ArrayList<CartItem>();

        public void AddItem(int productId)
        {
        CartItem newItem = new CartItem(productId);


            for (CartItem item:Items)
            {
                  if (item.Equal(newItem))
                  {
                    item.Quantity++;
                    return;
            }
          }


            newItem.Quantity = 1;
            Items.add(newItem);

        }
  }
2 голосов
/ 27 марта 2011
  ArrayList<CartItem> Items = new ArrayList<CartItem>();
if (Items.equals(newItem))

Вы сравниваете newItem с вашим списком? Я подозреваю, что он всегда будет терпеть неудачу, поскольку я не думаю, что newItem - это то же самое, что пустой ArrayList, однако ваш фрагмент кода выглядит неполным, поэтому я не могу быть на 100%.

EDIT:

CartItem.Equal выглядит неправильно:

  public boolean Equal(CartItem item)
    {

        final CartItem a = new CartItem(item.Id);
          if (this.itm.Id != a.ProductId)
          {
              return false;
          }
      return true;
    }

Зачем строить новый объект здесь? Этот метод должен сравнивать элемент параметра с текущим объектом CartItem (this). Например:

     public boolean Equal(CartItem item){
          return item.getId() == this.getId();//Implement a getId() method
    }

Я бы повторно посетил ваш класс CartItem - почему существует поле количества? Действительно ли этот класс должен представлять коллекцию предметов корзины?

Кроме того, почему вы не переопределили метод Object.equals (Object o)?

2 голосов
/ 27 марта 2011

Вы звоните:

if (Items.equals(newItem))

т.е..equals () в Списке CartItems.

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

Вы действительно должны-thingk - Реализуйте правильный метод java .eqauls () в CartItem. Затем вы можете использовать List.contains (CartItem), чтобы проверить, существует ли элемент.

Лучшее решение - хранить ваши элементы в HashMap(при помощи Item.id) для облегчения поиска.

1 голос
/ 27 марта 2011

Ваш метод equals на CartItem неправильный.

EDIT:

Я вижу, вы изменили его имя на Равное. Но ваш метод Equal принимает int, но когда вы используете его, вы передаете ему CartItem. Я не думаю, что это компилируется.

0 голосов
/ 27 марта 2011

Вместо проверки на Items.equals(newItem) необходимо проверить на Items.contains(newItem) и, конечно, переопределить equals в CartItem, чтобы проверить идентификатор продукта.Однако ваше решение выполняет итерацию по списку CartItems один раз в методе contains и снова, чтобы найти фактический CartItem.Это должно поднять тревогу по поводу вашего выбора структуры данных.

То, что вы пытаетесь сделать, это сопоставить идентификаторы продуктов с их количеством, это говорит о том, что карта может быть лучшей структурой данных.Использование карты даст вам реализацию, похожую на:

public Map<Integer, Integer> Items = new HashMap<Integer, Integer>();
public void AddItem(int productId)
{
    if (Items.containsKey(productId))
    {
        int count = Items.get(productId);
        Items.put(productId, count+1);
   }
    else
   {
        Items.put(productId, 1);
   }
}
0 голосов
/ 27 марта 2011

ArrayList использует CartItem.equals () для определения соответствия или нет, поэтому вы можете проверить реализацию CartItem.equals (). Кстати, это ничего с hashcode().

РЕДАКТИРОВАТЬ: Equals не является equals, параметр также неверен. Используйте @Override на equals(), чтобы убедиться в правильности.

0 голосов
/ 27 марта 2011

Я бы предложил изменить ваш подход.

Забудьте CartItem и просто сопоставьте ваш продукт с целым числом (количеством) с помощью карты

Вам не нужно также указывать идентификатор продукта, поскольку он ДОЛЖЕН быть членом Product.

class Cart {
   private Map<Product,Integer> cart;

   public Cart() {
       cart = new HashMap<Product,Integer>();
   }

   public int getQuantity(Product p) {
       if(cart.contains(p)) return cart.get(p);
       return 0; // not in the cart
   }

   public void add(Product p) {
      add(p,0);
   }

   public void add(Product p, int q) {
      if(q < 0) throw new IllegalArgumentException("Cannot add negative amounts");
      cart.put(p,getQuantity(p) + q);
   }

   // removes are left as exercise for the reader

}
...