java 统计集合中对象的不特定字段的平均值 80C

动态统计某字段

图片说明

 private RecordLevelModel getRecordLevelModel(Map.Entry<Integer, List<EsFitnessTestRecordDO>> entry, List<EsFitnessTestRecordDO> projectAndSexList) {
        RecordLevelModel bmiMaleModel = new RecordLevelModel().setGradeNumber(entry.getKey());
        Integer bmiUrbanMaleTotal = projectAndSexList.size();
        Map<String,Long> bmiMaleMap =  projectAndSexList.stream().collect(
                Collectors.groupingBy(EsFitnessTestRecordDO::getBmiRating,Collectors.counting()));
        for(Map.Entry<String,Long> entry1 : bmiMaleMap.entrySet())
        {
            LevelAndRegionModel levelAndRegionModel = new LevelAndRegionModel();
            double rate = entry1.getValue()/bmiUrbanMaleTotal;
            levelAndRegionModel.setLevelName(entry1.getKey()).setRate(rate).setTotal(Integer.parseInt(entry1.getValue().toString()));
            bmiMaleModel.getLevelModelList().add(levelAndRegionModel);
        }
        String projectName = "";
        Class<EsFitnessTestRecordDO> clz = EsFitnessTestRecordDO.class;
        try {
            String methodName = "get"+projectName;
            Method method = EsFitnessTestRecordDO.class.getMethod(methodName);
            double ave =  projectAndSexList.stream().mapToDouble(method).average().average().getAsDouble();
            double average = projectAndSexList.stream().mapToDouble(EsFitnessTestRecordDO::getBmi).average().getAsDouble();
        }catch (NoSuchMethodException e){
        }
        return bmiMaleModel;
    }

写了动态指定单个字段的分组,但是 MethodHandle handle = lookup.findGetter(this.getT().getClass(), fieldName, String.class); 会报错找不到字段,我确定字段没写错

public class CollectionsUtils<T> {

    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    public CollectionsUtils(T t) {
        this.t = t;
    }

    //多字段排序
    public   <T> Map<List<String>, List<T>> DynamicGroupListByFiled(List<T> data, String[] groupByFieldNames) {
        final MethodHandles.Lookup lookup = MethodHandles.lookup();
        List<MethodHandle> handles =
                Arrays.stream(groupByFieldNames)
                        .map(field -> {
                            try {
                                return lookup.findGetter(this.getT().getClass(), field, String.class);
                            } catch (Exception e) {
                                throw new RuntimeException(e);
                            }
                        }).collect(Collectors.toList());
        return data.stream().collect(Collectors.groupingBy(
                d -> handles.stream()
                        .map(handle -> {
                            try {
                                return (String) handle.invokeExact(d);
                            } catch (Throwable e) {
                                throw new RuntimeException(e);
                            }
                        }).collect(Collectors.toList())
        ));
    }

    //按某字段分组后统计数量
    public   Map<String, Long> DynamicGroupListByFiled(List<T> data, String fieldName) {
        final MethodHandles.Lookup lookup = MethodHandles.lookup();
        try {
            MethodHandle handle = lookup.findGetter(this.getT().getClass(), fieldName, String.class);
            return data.stream().collect(Collectors.groupingBy(
                    d -> {
                        try {
                            return (String) handle.invokeExact(d);
                        } catch (Throwable e) {
                            throw new RuntimeException(e);
                        }
                    } ,Collectors.counting()));
        }
        catch (Throwable e)
        {
            throw new RuntimeException();
        }


    }

    //算不定字段平均值
    public    Double getDynamicFieldAverage(List<T> data, String fieldName) {
        final MethodHandles.Lookup lookup = MethodHandles.lookup();
        try {
            MethodHandle handle = lookup.findGetter(this.getT().getClass(), fieldName, String.class);
            return  data.stream().mapToDouble(d -> {
                        try {
                            return (Double) handle.invokeExact(d);
                        } catch (Throwable e) {
                            throw new RuntimeException(e);
                        }
                    }
            ).average().getAsDouble();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

         @Test
   public void testCollectionUtils()
   {
       List<EsFitnessTestRecordDO> list = new ArrayList<>();
       list.add(new EsFitnessTestRecordDO().setBmiRating("优秀").setBmiScore(90D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("优秀").setBmiScore(92D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("优秀").setBmiScore(94D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("良好").setBmiScore(80D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("良好").setBmiScore(82D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("良好").setBmiScore(84D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("合格").setBmiScore(70D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("合格").setBmiScore(76D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("不合格").setBmiScore(50D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("不合格").setBmiScore(40D));
       list.add(new EsFitnessTestRecordDO().setBmiRating("不合格").setBmiScore(30D));
       CollectionsUtils<EsFitnessTestRecordDO> ct = new CollectionsUtils(EsFitnessTestRecordDO.class);
    //统计bmiRating字段 优秀、良好、合格、不合格的各自人数,bmiRating是传递的参数
       Map<String, Long> map =  ct.DynamicGroupListByFiled(list,"bmiRating");
    //计算bmiScore字段的平均值,bmiScore是传递的动态参数
       double bmiAverage = ct.getDynamicFieldAverage(list,"bmiScore");
   }

类的字段
调试bug图
BUG

1个回答

你光贴图片,没办法在上面给你改,但是,你可以把getBmiRating那里换成反射获取某个列的值。

以前用C#写过类似的程序,你看看是不是要这个效果:
https://ask.csdn.net/questions/703207

这里有一个java stream动态分组的代码:

private static Map<List<String>, List<MyClass>> groupListBy(List<MyClass> data, String[] groupByFieldNames) {
    final MethodHandles.Lookup lookup = MethodHandles.lookup();
    List<MethodHandle> handles = 
        Arrays.stream(groupByFieldNames)
              .map(field -> {
                  try {
                      return lookup.findGetter(MyClass.class, field, String.class);
                  } catch (Exception e) {
                      throw new RuntimeException(e);
                  }
              }).collect(toList());
    return data.stream().collect(groupingBy(
            d -> handles.stream()
                        .map(handle -> {
                            try {
                                return (String) handle.invokeExact(d);
                            } catch (Throwable e) {
                                throw new RuntimeException(e);
                            }
                        }).collect(toList())
        ));
}

同样的思路做动态取平均值也是一样的。

BIGE_BIGGER
BIGE_BIGGER 大哥,我按你的思路照着写的,我都贴上来了,有个报错找不到字段,帮我看下呢,能不能加个qq啊,万分感激。791001695
大约一年之前 回复
BIGE_BIGGER
BIGE_BIGGER 动态取平均值的时候data.stream().mapToDouble(XXXXX)这个该怎么写呢
大约一年之前 回复
BIGE_BIGGER
BIGE_BIGGER 动态分组按照你写的搞定了,求平均值的怎么写呢,平均值一次只能有一个字段
大约一年之前 回复
BIGE_BIGGER
BIGE_BIGGER 嗯嗯,就是要这样的,我贴了代码,能不能帮我改下,看不太懂。。。谢谢了
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

3
java 动态依据不特定字段进行分组和统计
2
通过java将Mongdodb中相同字段不同数据相加并得出每个值平均值
1
怎么通过java获取Mongdodb里面字段的所有值
2
flask sqlalchemy 如何查询不特定的字段
1
java怎么查询access2000数据库中某个字段的最近时间数据,sql语句怎么写
2
数据表中,如何在新增的字段里插入数据?
4
JAVA 使用jpa原生sql查询字段 别名无值,小白求大神慷慨赐教
3
java日期格式转化问题
1
MybatisPlus的代码生成器,查询时表中的字段名称默认使用了驼峰命名。
2
如何将整个word文档存入mysql数据库的指定字段中
6
Java代码里修改某个字段的状态马上查询这个状态的数据查询不到
1
mysql数据库中一个字段的数据 受另外另外一个表字段的影响 用触发器应该怎么实现呢??
2
MyBatis 中WHERE 数据库日期字段=#{java Date对象} 为什么查不到记录 ?
1
用面向对象的方法在Java语言中实现一个Student类,并且要包含至少3个字段,怎么做
4
求助,在学习Java反射的时候碰到的一个问题
1
Mysql中A表中的字段根据B表中A表ID的成绩的平均值来变化,可以实现吗?
1
使用mybatis,javabean类添加一个其他bean类,导致映射失败,有没有像hibernate的@Transient和mybatis-plus的@TableField(exist = false)一样的注解在一定时候忽略这个字段?
1
【MYSQL】开窗函数如何实现组内对平均值仅统计一次(分组查询)
1
Oracle中如何对多个字段的值进行判断并计数
3
hive 如何判断字段名是否存在,或者字段总数?