根据某个属性对List中的所有对象分组,该属性值相同的对象分到一个组

注:本人刚入行,想把工作遇到的问题写下来。前段时间跟公司前端对接的时候,一个简单的数据库查询,但是前端说将结果按某个属性分组,每组单独一个集合,集合第一个元素为该属性,第二个元素为该属性值相同的所有对象集合,由于是小白一个,这个数据整理也是花了点时间,这里整理一下处理方法。

1.利用JDK1.8的新特性处理,主要代码一行即可解决,下面上代码

@Service
public class AlarmStandardTabServiceImpl implements AlarmStandardTabService {
    @Autowired
    AlarmStandardTabMapper alarmStandardTabMapper;

    @Override
    public Result<List> findByAlarmType(String alarmType,Integer currentPage,Integer pageSize) {
        //查出来的格式[{"type1":"",...},{"type2":"",...},{"type3":"",...},{},{},{},{},{}]
        //前端要的格式[["type1",[{...},{...}]],["type2",[{...},{...}]],["type3",[{...},{...}]]]
        List<AlarmStandardTab> list=alarmStandardTabMapper.findByAlarmType(alarmType);

        //通过jdk1.8特性实现按告警类型分组存进map集合,分组后格式(key:分组字段值,value:该值相同的所有对象集合)
        //分组后的格式["type1":[{...},{...}],"type2":[{...},{...}],"type3":[{...},{...}]]
        //其实我觉得这样就行了,奈何前端小哥一意孤行,那就满足他
        Map<String,List<AlarmStandardTab>> map=list.stream().collect(Collectors.groupingBy(AlarmStandardTab::getTypeName));

        //下面是将已整理好格式的Map集合按照前端的意思重新整理一次。。。。可以忽略
        List list2=new ArrayList();
        for(String key:map.keySet()){
            List list3=new ArrayList();
            list3.add(0,key);
            list3.add(1,map.get(key));
            list2.add(list3);
        }
        return Result.of(Code.SC_OK.getState(),Code.SC_OK.getDescription(),list2);
    }
}

 上面的主要代码就是:

Map<String,List<AlarmStandardTab>> map=list.stream().collect(Collectors.groupingBy(AlarmStandardTab::getTypeName));

 其中AlarmStandardTab是一个实体类,getTypeName是typeName属性的get方法,也是根据这个属性类分组的

分组后的类型Map<String,List<AlarmStandardTab>>,其实到这已经行了,key为分组名,value为对应的对象集合,后续按要求可再做整理。

2.上面是根据jdk特性来处理的,下面把我手写的代码也放上来,可以当做一个思路,返回的数据格式一模一样。

List<AlarmStandardTab> list=alarmStandardTabMapper.findByAlarmType(alarmType);
Map<String,List<AlarmStandardTab>> map=new HashMap();
for(AlarmStandardTab alarmStandardTab:list){
      //map中已有当前告警类型名
      if(map.containsKey(alarmStandardTab.getTypeName())){
          List<AlarmStandardTab> list0=map.get(alarmStandardTab.getTypeName());
          list0.add(alarmStandardTab);
          map.put(alarmStandardTab.getTypeName(),list0);
      }else{
          List<AlarmStandardTab> list1=new ArrayList();
          list1.add(alarmStandardTab);
          map.put(alarmStandardTab.getTypeName(),list1);
}

整理一下思路:遍历已有的list,判断map里是否有当前对象的typeName,这里使用map.containsKey(Object key)来判断;如果有,则使用map.get(Object key)来得到对应集合;否则new一个List集合,add当前对象,并且map.put(key为当前对象的typeName,value为新new的list集合)。最后的map就是分组整理好的格式Map<String,List<AlarmStandardTab>>;

3.根据属性alarmType,汇总这个属性对应的所有对象的paramVal

Map<String, Double> collect = list.stream().collect(Collectors.groupingBy(AlarmStandardTab::getAlarmType,Collectors.summingDouble(AlarmStandardTab::getParamVal)));

4.根据给alarmType属性添加条件过滤数据,如查找alarmType为fileUt的数据

List<AlarmStandardTab> list = list.stream().filter(u -> u.getTypeName().equals("fileUt")).collect(Collectors.toList());

5.判断list里是否有元素的alarmType为fileUt,只要有一个就返回true

List<AlarmStandardTab> list=alarmStandardTabMapper.findByAlarmType(alarmType);
boolean flag = list.stream().anyMatch(m -> "fileUt".equals(m.getTypeName()));


//boolean anyMatch(Predicate<? super T> predicate)
//只要有一个条件满足即返回true

//boolean allMatch(Predicate<? super T> predicate)
//必须全部都满足才会返回true

//boolean noneMatch(Predicate<? super T> predicate)
//全都不满足才会返回true

6.取出一组对象的某个属性组成一个新集合

List<String> typeNames=list.stream().map(AlarmStandardTab::getTypeName).collect(Collectors.toList());

7.list去重复

List<T> list = list.stream().distinct().collect(Collectors.toList());

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
列表是一种常见的数据结构,其包含许多对象。如果我们想将这些对象根据某个属性分组,我们可以使用Python的groupby()函数。 groupby()函数的作用是将一个可迭代对象分组成多个小组,通常是基于某个关键字函数分组。我们可以使用这个函数根据列表每个对象的某个属性进行分组。关键字函数将返回一个我们想要将对象分组属性。然后,groupby()函数将所有具有相同属性对象分成一组,将它们放入一个由元组组成的列表。 例如,我们有一个列表,其包含多个学生对象。我们可以根据他们的年级来对学生进行分组。我们可以定义一个函数,将学生对象作为输入,输出他们的年级。然后使用groupby()函数将学生列表的学生根据年级分组。 以下是示例代码: ```python from itertools import groupby class Student: def __init__(self, name, grade): self.name = name self.grade = grade students = [ Student('Alice', 3), Student('Bob', 2), Student('Charlie', 3), Student('David', 2), ] def group_by_grade(student): return student.grade students_by_grade = [ (grade, list(students)) for grade, students in groupby(students, group_by_grade) ] for grade, students in students_by_grade: print(f"Grade {grade}: {[student.name for student in students]}") ``` 输出: ``` Grade 3: ['Alice', 'Charlie'] Grade 2: ['Bob', 'David'] ``` 这个例子,我们定义了一个名叫Student的类来表示学生。我们将学生对象存储在一个列表,然后定义一个group_by_grade()函数将学生对象根据其年级属性进行分组。我们使用groupby()函数将学生列表的学生根据年级进行分组,并将它们放置在一个由元组组成的列表。 最后,我们循环遍历每个组,打印出由该组内的学生组成的列表。 总之,我们可以使用Python的groupby()函数将具有共同属性对象分组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值