计算中位值
业务场景
实现自定义函数,函数功能为:取数据集中某字段的中位值。
比如emp员工数据集中age年龄字段的中间行数的值,当数据总行数为奇数时取中间行的age值,为偶数时取中间两行的平均age值。
该自定义函数的特点为:
- 涉及参数的传入与处理,在调用函数时需传入两个参数:数据集名称dsName,字段名称fieldname
- 根据传入的参数,在自定义函数中获取对应数据集字段的数据,计算出中位值然后返回
示例代码
下面是该自定义函数类的实现代码:
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;
}
}