Java List 相同条件数据合并相加

在实际开发中,我们经常会遇到需要将具有相同条件的数据进行合并并相加的情况。这对于对数据进行统计分析和生成报表非常有用。在Java中,我们可以通过List集合和Map集合来实现这一需求。接下来,我们将详细介绍如何使用Java来实现这一功能,并附上代码示例。

场景描述

假设我们有一个包含了多个商品销售数据的List集合,每个数据包含了商品名称和销售数量。我们希望将相同商品名称的销售数量合并相加,生成一个新的包含合并后数据的List集合。

实现步骤

1. 创建商品销售数据类

首先,我们需要创建一个类来表示商品销售数据,包括商品名称和销售数量两个属性。

public class SalesData {
    private String productName;
    private int salesQuantity;

    public SalesData(String productName, int salesQuantity) {
        this.productName = productName;
        this.salesQuantity = salesQuantity;
    }

    // 省略 getter 和 setter 方法
}

2. 初始化商品销售数据List

接下来,我们初始化一个包含商品销售数据的List集合。

List<SalesData> salesDataList = new ArrayList<>();
salesDataList.add(new SalesData("商品A", 10));
salesDataList.add(new SalesData("商品B", 15));
salesDataList.add(new SalesData("商品A", 20));
salesDataList.add(new SalesData("商品C", 5));

3. 合并相同条件数据并相加

我们需要创建一个Map集合来存储商品名称和对应的销售数量总和。遍历商品销售数据List,将相同商品名称的销售数量相加并存储到Map中。

Map<String, Integer> mergedSalesData = new HashMap<>();
for (SalesData data : salesDataList) {
    if (mergedSalesData.containsKey(data.getProductName())) {
        int totalQuantity = mergedSalesData.get(data.getProductName()) + data.getSalesQuantity();
        mergedSalesData.put(data.getProductName(), totalQuantity);
    } else {
        mergedSalesData.put(data.getProductName(), data.getSalesQuantity());
    }
}

4. 生成合并后的数据List

最后,我们可以根据Map中的数据生成合并后的数据List。

List<SalesData> mergedSalesDataList = new ArrayList<>();
for (Map.Entry<String, Integer> entry : mergedSalesData.entrySet()) {
    mergedSalesDataList.add(new SalesData(entry.getKey(), entry.getValue()));
}

完整代码示例

import java.util.*;

public class Main {

    public static void main(String[] args) {
        List<SalesData> salesDataList = new ArrayList<>();
        salesDataList.add(new SalesData("商品A", 10));
        salesDataList.add(new SalesData("商品B", 15));
        salesDataList.add(new SalesData("商品A", 20));
        salesDataList.add(new SalesData("商品C", 5));

        Map<String, Integer> mergedSalesData = new HashMap<>();
        for (SalesData data : salesDataList) {
            if (mergedSalesData.containsKey(data.getProductName())) {
                int totalQuantity = mergedSalesData.get(data.getProductName()) + data.getSalesQuantity();
                mergedSalesData.put(data.getProductName(), totalQuantity);
            } else {
                mergedSalesData.put(data.getProductName(), data.getSalesQuantity());
            }
        }

        List<SalesData> mergedSalesDataList = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : mergedSalesData.entrySet()) {
            mergedSalesDataList.add(new SalesData(entry.getKey(), entry.getValue()));
        }

        // 输出合并后的数据
        for (SalesData data : mergedSalesDataList) {
            System.out.println("商品名称: " + data.getProductName() + ", 销售数量: " + data.getSalesQuantity());
        }
    }

    static class SalesData {
        private String productName;
        private int salesQuantity;

        public SalesData(String productName, int salesQuantity) {
            this.productName = productName;
            this.salesQuantity = salesQuantity;
        }

        public String getProductName() {
            return productName;
        }

        public void setProductName(String productName) {
            this.productName = productName;
        }

        public int getSalesQuantity() {
            return salesQuantity;
        }

        public void setSalesQuantity(int salesQuantity) {
            this.salesQuantity = salesQuantity;
        }
    }
}

结果展示

饼状图

pie
    title 商品销售数量占比