计算中位值

业务场景

实现自定义函数,函数功能为:取数据集中某字段的中位值。

比如emp员工数据集中age年龄字段的中间行数的值,当数据总行数为奇数时取中间行的age值,为偶数时取中间两行的平均age值。

该自定义函数的特点为:

示例代码

下面是该自定义函数类的实现代码:

package com.api;
import com.runqian.report4.dataset.DataSet;
import com.runqian.report4.model.expression.SuperFunction;
import com.runqian.report4.model.expression.Variant2;
import com.runqian.report4.usermodel.Context;
public class getMiddleValue extends SuperFunction {
        @Override
        public Object calculate(Context ctx, booleanisInput) {
                String dsName=this.functionParam.getString(0);//取第一个参数,为指定数据集的名称
                String fileName=this.functionParam.getString(1);//取第二个参数,为指定数据集的字段
                DataSet ds=ctx.getDataSet(dsName);//从context上下文中根据数据集名称获取到数据集DataSet
                intcolNo=ds.getColNo(fileName);//取字段名在数据集中的列号
                introwCount=ds.getRowCount();//取数据集的行数
                // 判断取哪一行的数据,如果是奇数,取中间位置,如果是偶数,取中间两个位置的数的平均
                int age=0;
                if(rowCount%2!=0){
                        //行数为奇数的处理
                        introwNo=(rowCount/2)+1;//获取中间行数
                        Object data=ds.getData(rowNo, colNo);//取得指定行列的数据     
                        age=Variant2.intValue(data);
                        //注意上面不能写为age=((Integer)data).intValue();
                        //这么写是错误的,异常为java.lang.ClassCastException: java.math.BigDecimal
                        //必须用Variant2取值,因为每个表达式Expression和Node计算后都是一个结构
                        //可能是单元格ICell,可能是数据组Group,可能是数据行Row,还有很多种可能
                        //用Variant2可以取Expression计算后存储于特定结构中的值。                    
                }else{
                        //行数为偶数的处理
                        int rowNo1=(rowCount/2);
                        int  data1=Variant2.intValue(ds.getData(rowNo1, colNo));
                        int rowNo2=(rowCount/2)+1;
                        int data2=Variant2.intValue(ds.getData(rowNo2, colNo));
                        age= (data1+data2)/2;
                }
                return age;
        }
}