• 树形结构节点求和,以及set排序


    有个map,key值是code,value是金额,想通过下级code获得上级code的金额。例如下图:

     

    00的value的和等于0001+0002的和,依次类推。

    代码:

    package com.iss.itms.budgetmanage.budgeting.budgetimport;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    import java.util.Map.Entry;
    
    public class newSum {
        
        public static void main(String[] args) {
            Map map =new HashMap();
            Map sumByCode = sumByCode(map);
            System.out.println("---节点求和后的数据"+sumByCode.toString());
        }
        /**
         * 获得对应项目编号的金额数据
         * @param column6
         * @param column8
         * @return
         */
        private static Map sumByCode(Map sumByProjectCode){
            sumByProjectCode.put("00", null);
            sumByProjectCode.put("0001", 3);
            sumByProjectCode.put("0002", 3);
            sumByProjectCode.put("01", null);
            sumByProjectCode.put("0101", 4);
            sumByProjectCode.put("0102", 5);
            sumByProjectCode.put("0102", null);
            sumByProjectCode.put("010201", 2);
            sumByProjectCode.put("010202", 3);
            
            //对map进行降序排序
            Map<String, String> sortMap = sortMapByKey(sumByProjectCode);
            
            //一下是为了key值在循环的时候能进行remove操作进行的赋值操作
            Set<String> keySet = sortMap.keySet();
            Set<String> keySet2 = new HashSet<String>();
            keySet2.addAll(keySet);
            List<String> list = new ArrayList<String>(keySet2);
            Collections.sort(list);
            
            //迭代可以值获得和值
            for(Entry<String, String> entry : sortMap.entrySet()){
                String key = entry.getKey();
                Set set=new HashSet();
                int sum=0;
                Object[] array = list.toArray();
                for(int i=array.length-1;i>0;i--){
                    String key2=array[i].toString();
                    String regex=key+"\d+";
                    if (key2.matches(regex)) {
                        set.add(key2);
                        //有下级项目类型,就去下级项目金额和,不加本机的金额
                        sum+=Integer.parseInt(sortMap.get(key2));
                    }else if(key2.length()<=key.length()){
                        continue;
                    }else {
                        break;
                    }
                }
                if (set.size()!=0) {
                    list.removeAll(set);
                }
                //没有下级值才取自己的值信息
                if (sum==0) {
                    sum=Integer.parseInt(String.valueOf(sortMap.get(key)));
                }
                
                sortMap.put(key, String.valueOf(sum));
            }
            
            return sortMap;
        }
        
        /**
         * 使用 Map按key进行排序
         * @param map
         * @return
         */
        public static Map<String, String> sortMapByKey(Map<String, String> map) {
            if (map == null || map.isEmpty()) {
                return null;
            }
        
            Map<String, String> sortMap = new TreeMap<String, String>(
                    new MapKeyComparator());
        
            sortMap.putAll(map);
        
            return sortMap;
        }
    }
    
    class MapKeyComparator implements Comparator<String>{
    
        public int compare(String str1, String str2) {
            
            return str2.compareTo(str1);//调换可实现正序倒序
        }
    }

    输出为:

    ---节点求和后的数据{010202=3, 010201=2, 0102=5, 0101=4, 01=9, 0002=3, 0001=3, 00=6}

  • 相关阅读:
    exit()和_exit()的比较(与前一篇日志行缓冲区有关)
    标准IO缓冲详解全缓冲、行缓冲、不缓冲
    windows与unix/linux下输入回车换行的区别
    strtok()的用法
    头文件的处理
    feof()出现的问题及解决办法
    测试题
    视觉十四讲:第十二讲_八叉树地图
    树莓派4B安装OPENCV4.0
    编译OpenCV以及openc_contrib提示缺少boostdesc_bgm.i文件出错的解决
  • 原文地址:https://www.cnblogs.com/daguozb/p/10120382.html
Copyright © 2020-2023  润新知