在ArrayList中搜索相同的对象并合并价格值而不是添加

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ArrayList中搜索相同的对象并合并价格值而不是添加相关的知识,希望对你有一定的参考价值。

我有一个子类BetterBasket,可以访问超类BasketArrayList<Product>。我在add中的方法BetterBasket应该搜索ArrayList,如果有一个相同类型的对象,则必须将值添加到已存在的对象中,否则必须将对象添加到ArrayList中。到目前为止我的代码看起来像这样:

  @Override
  public boolean add( Product pr )
  {        
  super.add(pr);
  double x = pr.getPrice();

  for (int i=0; i < super.size(); i++) {

         if (super.get(i).equals(pr)) {
                double y = super.get(i).getPrice();
            super.get(i).setPrice(y + x);   
         }           
  }

// Collections.sort to sort ArrayList from highest to lowest product number   
(I have removed the code for this)

    return true;
    }

}

当我运行它时,该对象被添加到ArrayList但价格也加倍。我尝试了许多不同的变化但没有成功。任何提示或建议将不胜感激。

编辑:

if (!super.contains(pr)) {
  super.add(pr);

 } else {
     for (int i=0; i < super.size(); i++) {       
         if (super.get(i).equals(pr)) {
                double y = super.get(i).getPrice();
            super.get(i).setPrice(y + x);   
         }      
  }
     }

现在它将每个对象添加到arraylist,即使有两倍。

答案

假设您的Product类定义如下:

class Product {
    final int id;  // Primary key
    String name;
    double price;  // Should really be using BigDecimal but it's only an exercise

    public Product(int id) {
        this.id = id;
    }

    // Getters and setters follow...
}

然后你需要编写一个equals()方法:

class Product {
    final int id;  // Primary key
    String name;
    double price;  // Should really be using BigDecimal but it's only an exercise

    @Override
    publc boolean equals(Object o) {
        if (!(o instanceOf Product))
            return false;
        if (this == o)
            return true;
        return id == o.id;
    }

    @Override
    publc int hashCode() {
        return id;
    }

    // The rest...
}

然后你现有的代码应该工作(它依赖于我怀疑是一个缺少equals方法),但你可以缩短它:

@Override
public boolean add(Product pr) {
    int index = indexOf(pr);
    if (index >= 0) {
        Product existingProduct = get(index);
        existingProduct.setPrice(existingProduct.getPrice() + pr.getPrice());
    } else {
        add(pr);
    }
    return true;
}

顺便提一下,还有一些建议:

  1. 不要从ArrayList<Product>派生你的篮子课程。相反,将您的列表保存在private final List<Product> products = new ArrayList<>();中。你的篮子不是一个真正的ArrayList。如果是,那就意味着你可以将一个篮子传递给任何带有ArrayList的杂项方法。您的购物篮是根据ArrayList实现的。使用术语“首选组合继承”进行搜索以获取更多详细信息。
  2. 由于您不能在购物篮中拥有同一产品的多个实例,因此您应该使用HashSet而不是ArrayList。
  3. 而不是existingProduct.setPrice(existingProduct.getPrice() + pr.getPrice());你应该定义一个方法Product.adjustPrice并调用existingProduct.adjustPrice(pr.getPrice());。搜索“告诉,不要问原则”。
  4. 在更高级的应用程序中 - 如果有可能从多个线程调整产品的价格 - 您将需要应用同步。我怀疑你在这个阶段需要走得那么远,但只是提到未来。

以上是关于在ArrayList中搜索相同的对象并合并价格值而不是添加的主要内容,如果未能解决你的问题,请参考以下文章

仅将 ArrayList 作为值而不是引用传递

在 if 语句中使用数组值而不是 checkbox_id

如何根据javascript中的键合并和替换两个数组中的对象?

在 ArrayList Java 的最后一个元素中查找对象 [重复]

保持地图的顺序与[重复]之前的arrayList中的顺序相同

在 MongoDB 中搜索任何字段的值而不显式命名它