java中什么是分组函数_java 实现 分组 函数

这篇博客介绍了一个Java实现的数据处理方法,用于根据指定字段进行分组,并计算分组内的字段总和及平均值。示例代码展示了如何按'code'和'name'字段分组,同时计算'amount'和'quantity'的总和及平均值。通过DataUtils类的group方法,可以方便地处理这类数据聚合操作。
摘要由CSDN通过智能技术生成

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

*

* 使用demo

*

* group(data,new String[]{"code","name"},new String[]{"amount","quantity"},new String[][]{{"amount","avgAmount"},{"quantity","avgQuantity"}},"");

* 以上例子为

* 按code,name分组,sum amount,quantity两个字段 以及计算quantity,amount的平均值生成的对应的字段为avgAmount,avgQuantity

* 需要注意的是 计算平均的字段必须计算合计 即avgFields中的内容必须包函在sumFields中

*

*

* 测试用例

* DataUtils test = new DataUtils();

List> data= new ArrayList>();

Map map = new HashMap();

map.put("code", "001");

map.put("name", "test");

map.put("quantity", "20");

map.put("amount", "100");

map.put("price", "5");

data.add(map);

map = new HashMap();

map.put("code", "001");

map.put("name", "test");

map.put("quantity", "10");

map.put("amount", "200");

map.put("price", "20");

data.add(map);

map = new HashMap();

map.put("code", "002");

map.put("name", "test1");

map.put("quantity", "10");

map.put("amount", "200");

map.put("price", "20");

data.add(map);

map = new HashMap();

map.put("code", "003");

map.put("name", "test1");

map.put("quantity", "10");

map.put("amount", "200");

map.put("price", "20");

data.add(map);

List> result = test.group(data,new String[]{"code","name"},new String[]{"amount","quantity"},new String[][]{{"amount","avgAmount"},{"quantity","avgQuantity"}},"");

* @author 衣旧

*

* @date 2013-04-09

*

*/

public class DataUtils {

/**

* 分组函数

*

* @param groupFields

* 分组字段

* @param sumFields

* 合计字段

* @param avgFields

* 平均值字段

* @return

*/

public List> group(List> datas,String[] groupFields,String[] sumFields,String[][] avgFields){

return group(datas,groupFields,sumFields,avgFields,null);

}

/**

* 分组函数

*

* @param groupFields

* 分组字段

* @param sumFields

* 合计字段

* @param avgFields

* 平均值字段

* @param countField

* 分组后的count新字段

* @return

*/

public List> group(List> datas,String[] groupFields,String[] sumFields,String[][] avgFields,String countField){

Map temp = new HashMap();

for (Map data : datas) {

String groupFieldKey = "";

for (String groupField : groupFields) {

//code_name_ 即 code_001|name_test| code_003|name_test1|

groupFieldKey+=groupField+"_"+data.get(groupField)+"|";

}

//算分组合计

groupSum(sumFields, temp, data, groupFieldKey);

//统计分组行数

countField = groupCount(countField, temp, groupFieldKey);

//计算平均

groupAvg(avgFields, countField, temp, groupFieldKey);

}

//转换结果

List> results = covertResult(temp);

return results;

}

private void groupAvg(String[][] avgFields, String countField,

Map temp, String groupFieldKey) {

for (int i = 0; i < avgFields.length; i++) {

for (int j = 0; j < avgFields.length; j++) {

double value = (Double) temp.get(groupFieldKey+avgFields[i][0]);

int count = (Integer) temp.get(groupFieldKey+countField);

temp.put(groupFieldKey+avgFields[i][1], value/count);

}

}

}

/**

* 统计分组后的条数

* @param countField

* @param temp

* @param groupFieldKey

*/

private String groupCount(String countField, Map temp,

String groupFieldKey) {

if(countField == null || countField.trim().equals(""))countField = "&count";

String countFieldKey = groupFieldKey+countField;

if(temp.containsKey(countFieldKey)){

temp.put(countFieldKey, Integer.parseInt(temp.get(countFieldKey).toString())+1);

}else{

temp.put(countFieldKey, 1);

}

return countField;

}

/**

* 将temp中的key value 转换为List>对像

* @param temp

* @return

*/

private List> covertResult(Map temp) {

Map values = new HashMap();

for (String key : temp.keySet()) {

if(!values.containsKey(key.substring(0, key.lastIndexOf("|")))){

//code_001|name_test|quantity_10

values.put(key.substring(0, key.lastIndexOf("|")), key+"_"+temp.get(key));

continue;

}

for (String rk : values.keySet()) {

if(key.startsWith(rk)){

//code_001|name_test|quantity_10|amount_20

values.put(rk, values.get(rk)+key.substring(key.lastIndexOf("|"))+"_"+temp.get(key));

break;

}

}

}

List> results = new ArrayList>();

Map result;

for (Object key : values.values()) {

result = new HashMap();

String ss[] = key.toString().split("\\|");

for (String t : ss) {

String[] ts = t.split("_");

result.put(ts[0], ts[1]);

}

results.add(result);

}

return results;

}

/**

* 计算合计

* @param sumFields

* @param temp

* @param data

* @param groupFieldKey

*/

private void groupSum(String[] sumFields, Map temp,

Map data, String groupFieldKey) {

for (String sumField : sumFields) {

String groupFieldKey_sumField = groupFieldKey+sumField;

//code_name_quantity code_name_amount

//即code_001|name_test|quantity code_001|name_test|amount code_003|name_test1|amount

if(temp.containsKey(groupFieldKey_sumField)){

temp.put(groupFieldKey_sumField, Double.parseDouble(data.get(sumField).toString())+Double.parseDouble(temp.get(groupFieldKey_sumField).toString()));

}else{

temp.put(groupFieldKey_sumField, Double.parseDouble(data.get(sumField).toString()));

}

}

}

}http://deeplyloving.iteye.com/blog/1844673

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值