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

标签 java arraylist collections

我有对象的 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/

相关文章:

java - JList 填充了不显示任何内容的 vector

java - 如何在 bukkit 中存储变量的变量?

java - 将 CustomPropertyComparator 与 java.util.List 结合使用

swift - 通用结构的集合

java - 使用 HIbernate 从数据库检索日期时获取错误的日期时间字段值

java - 在java中的arrayList中生成动态对象名称

java - 在 Java Web 应用程序(JAX RS,Jersey)中提交表单时将 ArrayList 传递到 Response 类方法

java - ArrayList<Integer> 接受字符串

javascript - 通过数组值从集合中获取项目

java - Interrupted 与 isInterrupted 实现