我有对象的 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+1
与 k
体内。
这看起来是一个使用流可以更好解决的问题。
按价格对商品进行分组,然后使用下游收集器来聚合它们。
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/