map的key由"."進行分割的,將"."轉換爲嵌套map,不能使用任何工具

package com.pingan.ratelimit.config;

import com.alibaba.fastjson.JSON;

import java.awt.*;
import java.awt.print.Pageable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 作用:
 *
 * @author anti
 */
public class ChangeJSON {
    public static void main(String[] args) {

        // 測試
        Map<String, Object> container = new HashMap<>();
        getMapData().forEach((key, value) -> {
            Map<String, Object> data = change(new HashMap<>(), key, value);
            merge(container, data);
        });
        // 將toString方法覆蓋,輸出想要的json格式
        String json = jsonStyleFormat(container);
        System.out.println(json);
    }

    /**
     * 將toString方法覆蓋,輸出想要的json格式
     *
     * @param container 要格式化的的數據
     */
    private static String jsonStyleFormat(Map<String, Object> container) {
        String mapString = container.toString();
        System.out.println(mapString);
        return mapString.replaceAll("=", ":");
    }

    /**
     * 多個map有相同的key進行合併
     *
     * @param container 裝載遍歷之後的數據
     * @param data      要遍歷查看的數據
     * @return 合併之後的數據
     */
    private static Map<String, Object> merge(Map<String, Object> container, Map<String, Object> data) {
        // 遍歷map中的數據
        data.forEach((sonKey, sonValue) -> {
            // 如果容器中包含了目前遍歷的key,就代表這個key已經存在,需要覆蓋處理
            if (container.containsKey(sonKey)) {
                // 獲取覆蓋之前的數據
                Object oldValue = container.get(sonKey);
                // 如果不是map,就不需要再次判斷了
                if (!(sonValue instanceof Map)) {
                    return;
                }
                // 將新的合併的值放入容器
                container.put(sonKey, merge((Map<String, Object>) sonValue, (Map<String, Object>) oldValue));
            } else {
                // 如果沒有衝突,直接存入map
                container.put(sonKey, sonValue);
            }
        });
        return container;
    }

    /**
     * 根據"."的key進行解析成單獨的Map
     *
     * @param map   裝有解析數據的容器
     * @param key   每一次截取的key
     * @param value key對應的值
     * @return 解析之後的map
     */
    private static Map<String, Object> change(Map<String, Object> map, String key, Object value) {
        // 判斷字符串是否有.號
        if (key.contains(".")) {
            // 只要有.號,就代表有子map
            Map<String, Object> sonMap = new HashMap<>();
            // 獲取第一個.的位置方便獲取key
            int index = key.indexOf(".");
            // 獲取第一個key
            String firstKey = key.substring(0, index);
            // 獲取了第一個key之後,剩下的單獨作爲key在存入map,+2是因爲+1是這個字符串的下一個
            int beginIndex = key.indexOf(firstKey);
            String sonKey = key.substring(beginIndex + firstKey.length() + 1);
            // 將截取的第一個字符串重新裝配
            map.put(firstKey, change(sonMap, sonKey, value));
        } else {
            // 沒有點號,代表只有一個
            map.put(key, value);
        }
        return map;
    }

    /**
     * 提供測試數據
     */
    private static Map<String, Object> getMapData() {
        Map<String, Object> map = new HashMap<>();
        map.put("A", 1);
        map.put("B.A", 2);
        map.put("B.B", 3);
        map.put("CC.D.E", 4);
        map.put("CC.D.F", 5);
        map.put("E.F.G.D.A", 51);
        map.put("E.F.G.D.B", 52);
        return map;
    }
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章