樹形結構節點求和,以及set排序

有個map,key值是code,value是金額,想經過下級code得到上級code的金額。例以下圖:java

 

 

00的value的和等於0001+0002的和,依次類推。spa

代碼:code

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);//調換可實現正序倒序
    }
}

輸出爲:blog

---節點求和後的數據{010202=3, 010201=2, 0102=5, 0101=4, 01=9, 0002=3, 0001=3, 00=6}排序

相關文章
相關標籤/搜索