一、List分组求和

在处理数据的过程中,经常遇到从List中根据某一个属性进行分组,再对每个分组中的元素进行求和的需求。这时候我们可以先将List根据属性分组,然后对每个分组的元素进行求和即可。

    //定义一个Person类
    public class Person {
        private String name;
        private int age;
        private double salary;
        
        //getter & setter
    }
    
    //初始化List
    List personList = new ArrayList();
    
    //分组求和
    Map resultMap = personList.stream()
            .collect(Collectors.groupingBy(Person::getName, Collectors.summingDouble(Person::getSalary)));

上面的代码中,我们先定义一个Person类,包含姓名、年龄、工资三个属性。然后我们初始化一个Person列表,对其进行分组求和。

二、List分组求和jdk1.5

在jdk1.5中,我们可以使用普通的for循环和Map来实现List的分组求和。

    //初始化List
    List personList = new ArrayList();
    
    //分组求和
    Map resultMap = new HashMap();
    for (Person person : personList) {
        String name = person.getName();
        double salary = person.getSalary();
        if (resultMap.containsKey(name)) {
            resultMap.put(name, resultMap.get(name) + salary);
        } else {
            resultMap.put(name, salary);
        }
    }

上面的代码中,我们先初始化一个Person列表,然后使用Map来记录每个姓名对应的工资总和,最后得到分组求和的结果。

三、List分组求和BigDecimal

在进行金额的分组求和时,为了避免精度问题,我们可以使用BigDecimal来进行运算。

    //初始化List
    List personList = new ArrayList();
    
    //分组求和
    Map resultMap = new HashMap();
    for (Person person : personList) {
        String name = person.getName();
        BigDecimal salary = BigDecimal.valueOf(person.getSalary());
        if (resultMap.containsKey(name)) {
            resultMap.put(name, resultMap.get(name).add(salary));
        } else {
            resultMap.put(name, salary);
        }
    }

上面的代码中,我们先初始化一个Person列表,然后使用Map来记录每个姓名对应的工资总额,使用BigDecimal进行运算,避免精度问题。

四、List<Map>分组求和

在一些情况下,我们需要对List中的Map进行分组求和,这时候我们可以先将Map提取出需要分组的属性,然后进行分组求和。

    //初始化List
    List<Map> mapList = new ArrayList();
    
    //获取id和salary字段,按id分组求和
    Map resultMap = mapList.stream()
            .collect(Collectors.groupingBy(map -> map.get("id").toString(),
                    Collectors.summingDouble(map -> Double.parseDouble(map.get("salary").toString()))));

上面的代码中,我们先初始化一个List,其中包含多个Map,每个Map包含id和salary两个字段。我们将每个Map的id和salary提取出来,然后对id进行分组求和,并对每个分组的salary进行求和。

五、Python List分组求和

在Python中,我们可以使用defaultdict来实现List的分组求和。

    #初始化List
    person_list = [{"name": "Tom", "salary": 1000},
                   {"name": "Tom", "salary": 2000},
                   {"name": "Jerry", "salary": 1500}]
    
    #分组求和
    from collections import defaultdict
    
    result_dict = defaultdict(float)
    for person in person_list:
        name = person["name"]
        salary = person["salary"]
        result_dict[name] += salary

上面的代码中,我们先初始化一个Person列表,使用defaultdict来定义一个默认值为0的字典,然后使用普通的for循环来对List进行分组求和。

六、分组求和法

分组求和法是一种常用的数学方法,可以根据不同的数据特征,将数据分成不同的组别,再对每组数据进行求和运算。

例题:

一个班级有30个学生,他们的数学成绩分别为:42,75,85,65,90,78,56,33,88,67,72,86,75,60,76,92,78,66,85,76,56,78,90,68,55,97,78,82,74,59。

现在要将他们分成7组,分别求出每组学生的平均数。

    #初始化数据
    score_list = [42, 75, 85, 65, 90, 78, 56, 33, 88, 67, 72, 86, 75,
                  60, 76, 92, 78, 66, 85, 76, 56, 78, 90, 68, 55, 97,
                  78, 82, 74, 59]
    
    #分组求和
    group_num = 7
    sum_list = [0] * group_num
    num_list = [0] * group_num
    
    for score in score_list:
        group = int(score / 10)
        if group >= group_num:
            group = group_num - 1
        sum_list[group] += score
        num_list[group] += 1
    
    #求平均数
    avg_list = []
    for i in range(group_num):
        if num_list[i] == 0:
            avg_list.append(0)
        else:
            avg_list.append(float(sum_list[i]) / num_list[i])
            
    print(avg_list)

上面的代码中,我们首先初始化了一个30个元素的数学成绩列表,然后将其分成7组,再对每组数据进行求和运算,最后求出每组的平均数。

七、Excel分组求和

在Excel中,我们可以使用PivotTable来实现分组求和。

  1. 选中需要进行分组求和的数据
  2. 点击Insert -> PivotTable
  3. 在弹出的窗口中,选择需要进行分组求和的范围,然后点击OK
  4. 在弹出的窗口中,将需要进行分组求和的字段拖拽到Row Labels和Values中
  5. 在弹出的窗口中,将Values中的求和方式改为需要的方式

通过Excel的PivotTable功能,我们可以方便地对数据进行分组求和,并进行相应的数据可视化。