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
11 个月之前 回复
BIGE_BIGGER
BIGE_BIGGER 动态取平均值的时候data.stream().mapToDouble(XXXXX)这个该怎么写呢
11 个月之前 回复
BIGE_BIGGER
BIGE_BIGGER 动态分组按照你写的搞定了,求平均值的怎么写呢,平均值一次只能有一个字段
11 个月之前 回复
BIGE_BIGGER
BIGE_BIGGER 嗯嗯,就是要这样的,我贴了代码,能不能帮我改下,看不太懂。。。谢谢了
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
集合(2)把一个list集合中特定字段插入到另一个集合的特定字段中
List Couponlist=new ArrayList(); Couponlist=couponService.selectCouponByUniversityId(uId);
如何从集合中查找特定对象
        我在作一个项目时规定不让用复杂的SQL如多表联接子查询等,在作一个报表时没有办法只有生成多个List结果集再用一大堆的if,for组合成一个 List。其中有很都是从一个List中查找符合一定条件的对象,当时就用for+if 查找出后再放到一个新的List中,后来发现有更好的方法实现,方便多了。           我使用了org.apache.commons.collect...
统计list集合中的对象数量
一个由question对象组成的list集合,长度不确定。question对象本身包含两个属性,一个是questionType(类型)一个是questionNum(数量)。现在的需求是根据类型统计数量,即questionType相同,就将相同的类型的数量相加,请问我该怎么实现。小白,求各位大神能给个例子
如何从对象集合中取出特定对象?有分!
在我的页面session中有个list集合,list中存放的是从数据库中查询出的customer对象,每个customer对象中都有一个用于rnrn区别彼此的"id"属性,我用可以遍历所有的customer对象和它们的属性,但是,现在我想只从list集合中取rnrn出id为某一特定值的特定customer对象,然后把它的属性在页面进行显示,我该如何做?rnrn高手帮忙!!!!
不重复数据字段统计
 #!/usr/bin/perl -w $direct=$ARGV[0]; //read perl pamameter 1 system ("sh /home/fzhao/txt/1.sh $direct"); //perl call shell $count=0; $dup=0; $all=0; $len=0; @b=(); open my $fh , '<' ,'1'; open
java的list集合如何根据对象中的某个字段排序
集合提供了一个工具类:java.util.Collections 集合的工具类提供了若干静态方法,可以方便我们队集合做一系列操作,其中之一就是排序 需要注意,提供的方法只能对List集合排序,因为Set集合不全是有序的。 但是如果要求根据集合中某个元素的值排序,该如何进行呢? 代码演示 public static void main(String[] args) { ...
统计数量/求平均值
表格如下:rnrnid1 id2 id3 id4 id5 id6 n1 n2 n3 n4 n5 n6rn1 0 0 1 1 1 22 1 12 4 6 7rn1 1 1 1 0 0 3 5 6 7 8 9rn1 0 0 1 1 1 2 1 12 4 6 7rn1 1 1 1 0 0 3 5 6 7 8 19rnrn.. .. .. .. .. .. 。 。 。 。 。 。rnrnid列只有0和1两个值,n列是正整数。rn求 各种不同id排列的平均值rnrn如:rn100111 (22+1+12+4+6+7+2+1+12+4+6+7)/2rn111100 (3+5+6+7+8+9+3+5+6+7+8+19)/2 rnrn
怎么从集合中取出特定集合
一下为我从接口获得的数据,我想把id为1的数据拿出来,怎么实现?接口没有根据id查询数据的功能。。。rn[code=javascript]"content":["id":"1","tittle":"1","content":"1","creattime":"1","isread":"1","mdn":"1",rn"id":"2","tittle":"2","content":"2","creattime":"2","isread":"2","mdn":"2"],"size":2,"number":0,"sort":["direction":"ASC","property":"creattime","ascending":true],"totalPages":2,"numberOfElements":2,"totalElements":3,"firstPage":true,"lastPage":false[/code]
统计各行平均值命令
awk '{for(i=1;i
如何分段统计平均值
SERIANO scorern1 90rn2 89rn3 88rn4 87rn5 80rn6 79rn7 75rn8 60rn9 55rn10 50rn11 40rn... ...rn将学生按照成绩排名分段,求各个分段区间内的成绩的平均值rn如按照每5名统计一个平均值,则(1-5)为一个统计区间,(6-10)为一个统计区间,以此类推,则统计后的结果如下rn scorern(90 + 89 + 88 + 87 + 80)/5rn(79 + 75 + 60 + 55 + 50)/5rn...rn求解相应的sql语句
java集合对象
java集合对象 介绍集合对象  Set:集----存储数据无序,所以不能存储相同的数据,set在存储数据方面有优势  List:列表-----存储数据有序,所以可以存储相同的数据,list在向集合对象中的指定位置添加数据和得到数据方面有优势 Map是以键值对的形式存储数据,在map中添加数据的时候,值可以相同,但是键不能相同,如果添加相同的键,会将已经存在的数据覆盖
Java 对象集合
java 对象集合 1.JDK中对象集合和相关接口 JDk中主要集合类型主要分为以下四种; set:无序不可重复集合 list:有序可重复集合 map:具有映射关系集合 queue:具有队列性质集合 集合相关接口和类: Collection是JDK中集合类型上层接口,很多相关接口和集合类都派生自它。 对象集合的一个限制:Java集合不能保存原始数据类型的数据,传入原始数据类...
【Java】对象容器——集合
Java集合类型分为Collection和Map。所有的Java集合都在java.util包中 学习Java中的集合,首先从接口入手,重点掌握List,Set,Map三个接口。 1.List集合     List集合中的元素是有序的,可以重复出现。 List接口的实现类有ArrayList和LinkedList。ArrayList是基于动态数组数据结构的实现,LinkedLis...
java对象的集合(下)
 JAVA基础:对象的集合(下)(12)Map 的功能:Map用put(Object key, Object value)方法会往 Map 里面加一个值,并且把这个值同键(你查找时所用的对象)联系起来。给出键之后,get(Object key)就会返回与之相关联的值。你也可以用 containsKey( ) 和 containsValue( )测试 Map 是否包含有某个键或值。map中的
统计特定文件中的词频
统计特定文件中的词频
java 统计对象个数
我想统计在一段程序里Point类的实例个数。在构造函数里用变量num++即可实现,但如果我删除一个实例,怎么在析构函数里利用num--来记录实例个数?
研究特定对象在集合中任意传递的算法。
各位老大,请教一个问题。rnrn现要研究一个特定对象被一个集合中的对象之间任意传递。研究这个对象的传递路径。这是属于算法里的哪一个范畴
List去重:根据集合中对象特定属性去重(2)
说明:第一篇我们使用HashSet,也即是HasMap的数据结构实现的去重,这里面有几个问题:1.性能问题,在去重的过程中创建了不必要的过渡对象,实际的效率会有所降低;2.对实体类有侵入,为了覆盖hashcode和equals方法,我们写了抽象类来实现这部分代码并设置去重属性,那么所要去重的实体类必须继承自这个抽象类;3.无法实现两个对象在我的定义下等价时的取舍,也就是去重的对象我们没办法控制;4
List去重:根据集合中对象特定属性去重(1)
原始需求如下:根据一个json数组中的元素的特定属性去重。 例如:"[{"plateNumber":"京A00001","model":"tesla90","color":"black"},{"plateNumber":"京A00001","model":"tesla90","color":"black"},{"plateNumber":"京A00001","model":"tesla90"
[急]如何找到指定集合中的特定对象
比如有一个Controls集合里有button和listbox两种对象我希望取出所有的listbox对象并对他修改
读取字段求平均值
[img=https://img-bbs.csdn.net/upload/201404/04/1396577504_230520.jpg][/img]rnSQL语句怎样读取上面表的第五个字段,求平均值,然后存到一个新表中!最好用存储过程实现!
Access中统计等于特定值的字段个数
表的设计如图所示:rn[img=http://laoqi.me/wp-content/uploads/2012/10/d123.jpg][/img]rnrnid01 id02 .......id07 为7个表字段,而且每个字段的值只能等于1或2或3 rnrn想用后面的字段 C1 C2 C3 来统计当前这条记录里等于1 等于2 等于3的字段个数rnrn用vba怎么实现或者说数据库能直接实现更好
list stream:过滤对象集合中对象字段满足条件的对象集合
假如我们有一个User对象,对象字段如下: @Data @Builder class User{ private String name; private int id; } 如果我们存在这样的一个List列表,如果我们希望找出这个List中name为ONE的对象,当然我们可以通过for循环来逐个匹配,然后再放入到另外一个List中,这里我们来展示一种Java1.8中为我们提...
统计指定路径下所有Excel文件中特定字段的数据
问题 : 经常遇到许多Excel文件,需要提取其中特定字段的值,并做统计。可是手工操作费时费力! #!/usr/bin/python2.7 # -*- coding: UTF-8 -*- import os import xlrd import xlsxwriter import sys reload(sys) sys.setdefaultencoding('utf-8') #...
34_ElasticSearch bucket+metric:统计每种分组中的平均值
34_ElasticSearch bucket+metric:统计每种分组中的平均值更多干货分布式实战(干货)spring cloud 实战(干货)mybatis 实战(干货)spring boot 实战(干货)React 入门实战(干货)构建中小型互联网企业架构(干货)python 学习持续更新ElasticSearch 笔记一、需求说明bucket和metric 组合:统计每种颜色电视平均价格...
java嵌套循环。集合能否不循环直接判断所有对象中的字段?
被嵌套的循环是个List《User》。user里有name字段。name等于a 放一个lable a。否则放一个b。第二个集合能不能不循环直接判断?不然10条的话我就有9个b。但只想要一个b。谢谢!
ASP.NET中的集合对象
ASP.NET中的集合对象 video<br/>
集合中对象的排序
private void sortByDistance(List list) { Collections.sort(list, new Comparator() { @Override public int compare(SchoolAdressBean.ResultBean lhs, SchoolAdressBean.ResultBean rhs) {
java中集合Collection转list对象
首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品ID,V就是购物项 Map&amp;lt;Integer, CartItem&amp;gt; map = new LinkedHashMap&amp;lt;Integer, CartItem&amp;gt;(); public Collection&amp;lt;Cart...
java中深拷贝成员为集合的对象
java中深拷贝,浅拷贝参考:http://blog.csdn.net/tounaobun/article/details/8491392 如何拷贝成员为集合的内部类数据: public class ScreenConditionInfo implements Serializable, Cloneable { private List&amp;lt;ItemListBean&amp;gt; ItemL...
Java中随机抽取List集合中特定个数的子项
/* * author:wsx */ public List getSubStringByRadom(List list, int count){ List backList = null; backList = new ArrayList(); Random random = new Random(); int backSum = 0; if (list.size(
java中对象集合的比较与排序
现种方式。一是对象本身直接实现Comparable接口 [code=&quot;java&quot;] class Student implements Comparable{ private int age; private String name; //实现Comparable接口方法 public int compareTo(Object o){ Student s ...
关于JAVA中集合对象的编辑
不知道大家有没有遇到过这个问题,可能我是新手不太了解把, 经常出现遍历集合然后删除或者新增这个集合中的对象 例如集合A是一个String的list  List list ; foreach(String str list){       list.remove(str); } 这个就是一个典型的错误,在你遍历集合的时候是不能同时修改它的,准确的说
flask sqlalchemy 如何查询不特定的字段
1、问题rn 我想在前端传递不特定字段到后端,比如数据库中有user表有一个姓名字段和一个电话字段,我前端做一个选择下拉框,然后将姓名字段名和电话字段名放在下拉框中rn 下图为前端时间的代码示例rnrn```rn rn 时间类型rn % for k in sj %rn k rn % endfor %rn rn rn rn```rn时间类型为选择框,加入有两个变量,我现在通过name属性将时间类型的value值传递到后端。rnrn```rnqueryParams: function queryParams(params) //设置查询参数rn var param = rn 'pageNumber' : params.pageNumber,rn 'pageSize' : params.pageSize,rn 'select_sjlx':$("#select_sjlx").val(),rn 'entryDatestart':$("#entryDatestart").val(),rn 'entryDatestop':$("#entryDatestop").val(),rn 'select_cxkm':$("#select_cxkm").val(),rn 'lookupcontent':$("#lookupcontent").val()rn //keyword:params.search,rn ;rn```rnrn后端接收数据代码如下:rnrn```rn pageNumber=request.args.get('pageNumber',default=1, type=int)rn pageSize = request.args.get('pageSize', default=30, type=int)rn select_sjlx = request.args.get('select_sjlx')rn entryDatestart = request.args.get('entryDatestart')rn entryDatestop = request.args.get('entryDatestop')rnrn```rn查询字符串如下:rnrn```rn if select_cxkm == 'ZF_id':rn rows = current_user.query.filter(User.字段名.ilike('%'+ lookupcontent +'%')).paginate(rn page=pageNumber,rn per_page=pageSize,rn error_out=Falsern )rn```rn问题是:如何把查询字符串中的字段名更换为接受到的变量,变量名其实也是字段名,但是是字符串的格式。rn我尝试用rnrn```rnb = 'id'rna= 'User.query.filter_by('+b+'=1).first()'rnarn'User.query.filter_by(id=1).first()'rn```rn的方式处理,但是这个查询语句是一个字符串,怎么转换为查询语句
指定特定对象的特定事件
一 介绍 该方法是在JavaScript的&amp;lt;script&amp;gt;标记中指定特定的对象,以及该对象要执行的事件名称,并在&amp;lt;script&amp;gt;和&amp;lt;/script&amp;gt;标记中编写事件处理程序代码。 语法: &amp;lt;script language=&quot;JavaScript&quot; for=&quot;对象&quot; event=&quot;事件&quot;&amp;gt; … //事件处理程序代码 … &am
快速统计最大值 最小值 平均值
有了统计的数据,就可以对产品进行数据分析,比如,我们要看分析那个产品的利润最高,销售前10名的排行榜,那地区销售最好,无疑,用数据透视表可以快速的实现。
case 语句统计平均值问题
t1rn列分别为编号,金额,类型,数目,货物编号rnid money type num p_idrn1 1.2 1 2 1rn2 1.3 1 3 1rn3 1.1 1 2 2rn4 1.5 2 6 2rn5 1.2 2 5 1rnrn我用case语句判定是什么操作,然后想按照操作类型统计货品的平均价格(每笔单价和数量相乘的总和再除以总数量)rn但是好像除以总数的语句提示不能为0rn谢谢
统计前20行记录的一字段的最大值,平均值?
表T_Data(id,datatime,Flux)rn按时间倒序,统计前20行记录的最大值rn这是这样写的:rnselect top 20 datatime,max(Flux) from T_Data order by datatime desc,idrnrn为什么不能执行呢?而在SQL Server下能通过!rnrn求在Access下的SQL!rn谢谢!rnrn
水晶报表中求几个字段的平均值
现在有一个老程序没有源码了,报表用的是水晶报表4.6,现在要对报表中几个字段求平均值,例如:字段A,B,C,D,E,请问应该怎样在水晶报表中实现,最好能给出例子,谢谢!
java List集合中根据集合对象的属性值进行排序
//进行排序的实体对象 package com.compile; public class User {      String name;      String age;           public User(String name,String age){       this.name=name;       this.age=age;      }
相关热词 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天 c#字典序排序 c# 截屏取色 c#中的哪些属于托管机制