gpt4 book ai didi

java - ArrayList 'squash' 对其元素的操作

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:41 24 4
gpt4 key购买 nike

我有一个看似微不足道的问题,但我正在寻找解决该问题的最佳方法。

假设我有一个类:

产品类

public class Product {
private int id;
private String code;
private String price;
private String quantity;

public Product() {}

//getters and setters

@Override
public boolean equals(Object obj) {
boolean result = false;
if (obj instanceof ProductOnStockDto) {
ProductOnStockDto product = (ProductOnStockDto) obj;
result = (this.code.equals(product.getCode()) && this.price.equals(product.getPrice()));
}
return result;
}
}

假设我有一个对象列表:

List<Product> products;

其中填充了类似 this 的数据(1 行是一个列表元素):

我需要的是遍历此列表并压缩具有相同代码和相同价格的元素。例如:

在结果列表中,我想为 code 3 提供两个产品:

code 3 | 1.22 | 11
code 3 | 2.20 | 6

所以我会这样做:

for(Product product : products) {
for(Product productToSquash : products) {
if(product.getId() != productToSquash.getId() && product.equals(productToSquash)) {
//Here I would like to squash these two rows
//Data conversion is ommited
product.setQuantity(product.getQuantity() + productToSquash.getQuantity());
//after that I would like to remove productToSquash object from the collection
}
}
}

但据我所知,不允许修改我正在迭代的集合。那么根据示例压缩所有产品列表的最佳方法是什么?

最佳答案

首先,您的 equals()方法引用ProductOnStockDto .那应该是Product .

要在迭代期间删除元素,请使用 Iterator直接,即使用“旧式”for 循环,并使用 Map<Product, Product>跟踪以前看到的产品。这要求您还实现 hashCode() :

@Override
public int hashCode()
{
return this.code.hashCode() * 37 + this.price.hashCode();
}
Map<Product, Product> map = new HashMap<Product, Product>();
for (Iterator<Product> productIter = products.iterator(); productIter.hasNext(); ) {
Product product = productIter.next();
Product productToKeep = map.get(product);
if (productToKeep == null)
map.put(product, product);
else {
productToKeep.setQuantity(productToKeep.getQuantity() + product.getQuantity());
productIter.remove();
}
}

你真的不应该这样做,因为 equals()方法正在返回 true对于不是真正相等的对象。

你应该有一个只有 code 的键类和 price ,关键类是需要实现的类 equals()hashCode() , 不是 Product .

关于java - ArrayList 'squash' 对其元素的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34365810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com