gpt4 book ai didi

java - Java中基于属性的压缩ArrayList

转载 作者:行者123 更新时间:2023-12-01 20:00:06 24 4
gpt4 key购买 nike

我有对象的 Java ArrayList,我想在比较 unitPrice 属性后将其压缩为数组中尽可能少的项目

以下ArrayList为例

 data = [ 
{itemName: "Apple", purchaseDate: "Jan 01 2017", purchasedQuantity: 10, unitPrice:10},
{itemName: "Apple", purchaseDate: "Feb 01 2017", purchasedQuantity: 12, unitPrice:10},
{itemName: "Apple", purchaseDate: "Mar 01 2017", purchasedQuantity: 14, unitPrice:15},
{itemName: "Apple", purchaseDate: "Apr 01 2017", purchasedQuantity: 16, unitPrice:15},
{itemName: "Apple", purchaseDate: "May 01 2017", purchasedQuantity: 18, unitPrice:10}
]

在上面的示例中,第 0 个、第 1 个和第 4 个项目具有相同的单位价格,其余两个具有相同的价格。我希望在添加购买数量后将第 0、第 1 和第 4 项压缩为一个项目,将第 2 和第 3 项压缩为另一个项目

 data = [ 
{itemName: "Apple", purchaseDate: "Jan 01 2017", purchasedQuantity: 40, unitPrice:10},
{itemName: "Apple", purchaseDate: "Mar 01 2017", purchasedQuantity: 30, unitPrice:15}
]

我尝试了以下代码

for(int i = 0; i < data.size(); i++){
int productQuantityInStock = 0;
for(int k = 0; k < data.size()-1; k++){
if((i != k+1) && (data.get(i).getunitPrice().equals(data.get(k+1).getunitPrice()))){
productQuantityInStock = Integer.parseInt(data.get(i).getpurchasedQuantity()) + Integer.parseInt(data.get(k + 1).getpurchasedQuantity());
data.get(i).setProductInStock(String.valueOf(productQuantityInStock));
data.remove(k + 1);
}

}
}

但我没有得到想要的结果。

最佳答案

就代码中的问题而言,这是一个经典问题:您在向前迭代时从列表中删除元素。

这意味着当您删除元素 k+1 时,之前位于索引 k+2 的元素成为索引 k+1 处的新元素;然后你增加 k ,因此您再也不会检查该元素。

这里最简单的修复就是迭代 k反过来:

for(int k = data.size()-2; k >= 0; k--){

请注意,您始终使用 k+1 ,而不是 k ,所以您可能会发现使用起来更容易

for(int k = data.size()-1; k > 0; k--){

并替换k+1k体内。

<小时/>

这看起来是一个使用流可以更好解决的问题。

按价格对商品进行分组,然后使用下游收集器来聚合它们。

Collection<Item> reduced = data.stream()
.collect(
Collectors.groupingBy(Item::getunitPrice),
Collectors.reducing((i, j) -> {
int productQuantityInStock = Integer.parseInt(i.getpurchasedQuantity()) + Integer.parseInt(j).getpurchasedQuantity());
i.setProductInStock(String.valueOf(productQuantityInStock));
return i;
})
.values();

(顺便说一句,将购买数量和库存数量存储为流看起来不是一个好主意。如果您将它们解析为整数,并存储整数的字符串表示形式,为什么不直接使用整数呢?)

关于java - Java中基于属性的压缩ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48296960/

24 4 0