nickevin 2010-01-20 14:55
浏览 239
已采纳

请教 分组汇总 问题

场景:

有多条记录 需要 根据 字段1 字段2 ... 分组
将记录中是[color=red]数值类型[/color]的字段 汇总
[color=red]非数值类型并且不是分组字段[/color] 将其设为 null

公司 行业 资产 增长率
a edu 10 .5%
b it 20 .3%
c gov 15 .2%
d it 12 .3%

如果根据 行业 分组 然后汇总 得出

公司 行业 资产 增长率
null edu 10 .5%
null it 32 .6%
null gov 15 .2%

需要是一个 通用的算法 期望的api 是 这样的

Set group(Set , Array)
1. 参数1 : 需要分组汇总的集合
2. 参数2 : 需要分组的字段数组
3. 返回值 : 分组汇总的集合

谢谢

  • 写回答

4条回答 默认 最新

  • 宁静-夏天 2010-01-21 11:39
    关注

    [code="java"]
    public Set> getResult2(Set> set,Set array){
    /* 结构Set的散列结构 /
    Map> distMap = new HashMap>();
    /
    获取不关注的field /
    Set discardFields;
    /
    汇总数据的field */
    Set caculateFields;

        /* 调用prepare2进行汇总,针对Map结构的情况 */
        Set result = new HashSet();
        result.addAll(distMap.values());
        return result;
    }
    
    /*准备工作*/
    public void prepare2(Map<String,Map<String,Object>> distMap,
            Map <String,Object> addMap,
            Set<String> discardFields,
            Set<String> caculateFields){
        /*调用setNul处理被汇总的Map*/
    
        /* 判断addMap的groupby 是否已经存在
         * <1> 不存在,就把addMap放进去
         *  
         * <1> 已经存在了,对存在的Map进行加运算 
          */
    }
    
    /* 设置不关注的field为null */
    void setNul(Map <String,Object> addMap,Set<String> discardFields){
    }
    
    /*获取不关注的field,被关注的field无非是数字类型和groupby的字段*/
    Set<String> discardField(Set fields,Set<String> groupbySet){
        return null;
    }
    
    String groupByValue2(Map<String,Object> set,Set<String> array){
        StringBuilder str = new StringBuilder();
        Iterator<String> it = array.iterator();
        while(it.hasNext()){
            str.append(set.get(it.next()));
        }
        return str.toString();
    }
    

    public Set provideSet(){
    Set set = new HashSet();
    for(int i=0;i Person p = new Person();
    p.setAge(i+1);
    p.setSalary(new Long(1000+i*100));
    p.setName("name"+(i+1));
    p.setCompany("company"+(i+1));
    p.setCity("city"+(i+1));
    set.add(p);
    }
    return set;
    }
    public Set> provideSet2(){
    Set> set = new HashSet>();
    for(int i=0;i Map p = new HashMap();
    p.put("age",new Integer(i+1));
    p.put("salary",new Long(1000+i*100));
    p.put("name","name"+(i+1));
    p.put("company","company"+(i+1));
    p.put("city","city"+(i+1));
    set.add(p);
    }
    return set;
    }
    [/code]
    前天回答被楼主鄙视了下列,今天抽了十分钟写了这个思路,
    我也觉得没什么东西,思路很简单,代码命名很粗。但楼主的功能应该能满足。
    大家排砖。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥30 dspbuilder中使用signalcompiler时报错Error during compilation: Fitter failed,求解决办法
  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题