Как найти объекты в суперклассе ArrayList? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть подкласс BetterBasket, который наследуется от суперкласса Basket, который сам наследует от ArrayList<Product>.Мой метод add в BetterBasket добавляет элемент, который ищется через ArrayList, и если есть объект того же типа, то значения должны быть добавлены к уже существующему объекту (объедините quantity и price)и, если нет, объект должен быть добавлен в ArrayList.Это мой код, но он не будет работать должным образом, так как он будет добавлять продукты по мере необходимости, но не будет объединять те же продукты.Так что он не использует остальную часть кода.

@Override
public boolean add(Product pr) 
{  
  if (!this.contains(pr)){ //if array doesn't contain the item
      super.add(pr); //adds item

  } else { //add item quantity and price to existing item.

      double x = pr.getPrice();
         int q = pr.getQuantity();

     for (int i=0; i < super.size(); i++)  //loop through array   
     {
         if (super.get(i).equals(pr)){ //if item is same as item within 
                                       //the array
            int w = super.get(i).getQuantity();
            double y = super.get(i).getPrice();

            super.get(i).setQuantity(q + w);
            super.get(i).setPrice(y + x);   
         }
     }
  }
  return true;
 }

Должен ли я использовать this или super для первого оператора if?Почему ветвь else не используется?

1 Ответ

0 голосов
/ 19 июня 2019

Причина, по которой ваша ветвь else никогда не выбирается, заключается в том, что contains всегда возвращает false.Наиболее вероятная причина этого заключается в том, что ваш компонент Product не переопределяет equals и hashCode:

public boolean contains(Object o): Возвращает true, если этот список содержит указанный элемент.Более формально, возвращает true тогда и только тогда, когда этот список содержит хотя бы один элемент e такой, что (o == null? E == null: o.equals (e)). ArrayList.contains

См. Также этот пост .

По той же причине использование equals в for Цикл также вряд ли будет делать то, что вы хотите.Для ваших требований, похоже, что HashMap может быть лучшим выбором структуры данных.

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

...