如何在超类(Java)中成功合并数组对象?

时间:2018-12-19 20:06:16

标签: java arrays array-merge

我有一个子类 BetterBasket ,可以访问超类 Basket 和一个ArrayList。我在BetterBasket中的方法“添加”添加了通过ArrayList搜索的项目,并且如果存在与该对象相同类型的对象,则必须将值添加到已经存在的对象中(合并“数量”和“价格”),否则必须添加该对象进入ArrayList。这是我的代码,但无法正常工作,因为它将根据需要添加产品,但不会合并相同的产品。因此,它不使用代码的else部分。我需要有人指出出什么问题了,因为看起来我已经正确地完成了所有工作,但缺少一小部分才能使它正常工作,我只是不知道自己在做错什么,并尝试了数百种不同的方法: / p>

@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;
 }

注意: 我以前使用过一些调试功能,但发现它甚至都不会进入else语句部分。 我应该在第一个IF语句中使用“ this”或“ super”吗? 为什么我的其他人没有被使用?

1 个答案:

答案 0 :(得分:0)

从未选择else分支的原因是因为contains总是返回false。造成这种情况的最可能原因是,您的组件元素Product没有覆盖equalshashCode

  

public boolean contains(Object o):如果此列表包含指定的元素,则返回true。更正式地讲,当且仅当此列表包含至少一个元素(e == null?e == null:o.equals(e))时,返回true。 ArrayList.contains

另请参阅this post

出于相同的原因,在equals循环中使用for也不太可能做您想要的事情。根据您的要求,看来HashMap可能是更好的数据结构选择。

我们正在考虑使用using composition instead of inheritance来访问ArrayList功能,这是一个好主意。使用浮点类型表示货币也是not recommended