面试:读取路径值问题

标题
  按路径读取配置的值
  <p>
  题目描述
  某个程序把配置保存在一个复杂对象中, 请实现一个类(需要的话可以多个类), 实现根据配置路径从配置对象中读取对应的值的功能.
  <p>
  配置对象声明类型为 Object, 实际类型可能是Map<String, Object>或者List<Object>.
  Map 的值的实际可能类型: Map<String, Object>, List<Object>, String, Integer, Long, Boolean, Float, Double.
  List 元素的实际可能类型同 Map 值.
  <p>
  配置路径使用字符串表示, 使用 '.' 分割路径中 Map 的 key, 使用 "[]" 表示 List 中的索引. 以如下 YAML 表示的配置对象为例
  
  a:
  - "111"
  - "222"
  - c: "333"
  b: "444"
  
  按路径 "a[0]" 读到值应该是 "111"
  按路径 "a[2].c' 读到的值应该是 "333", 
  按路径 "b" 读到的值应该是 "444".
  <p>
  
  // Java 语言上述 YAML 的内存表示示意:
  Map<String, Object> a2 = new HashMap<>();
  a2.put("c", "333");
  List<Object> a = Arrays.asList("111", "222", a2);
  Map<String, Object> root = new HashMap<>();
  root.put("a", a);
  root.put("b", "444");
  
  <p>
  注意
  - 优先考虑代码可读性和结构
  - 建议给出单测用例 (可以使用注释的形式)
  - 可以使用 IDE, 但需要共享屏幕, 并在结束前把代码复制到面试系统中
package interview;

import com.google.gson.Gson;

import java.util.Map;

import java.util.*;

public class xiaomi {
    public static HashMap<String, Object> root = new HashMap<>();


    public static void main(String[] args) {
        Map<String, Object> a2 = new HashMap<>();
        a2.put("a", "12u3");
        List<Object> a = Arrays.asList("111", "222", a2);
        root.put("b", a);
        xiaomi xiaomi = new xiaomi();
        xiaomi.get("b[2].a");
    }

    public Object get(String input) {
        String[] key = input.split("\\.");
        Object result = "";
        //1 根据.分级
        int depth = 0;
        while (depth < key.length) {
            if (result == null) {
                return null;
            }
            if (key[depth].contains("]")) {
                result = root.get(key[depth].substring(0, key[depth].lastIndexOf("[")));
                //处理list
                List<Object> listValue = (List<Object>) result;
                Integer index = Integer.valueOf(key[depth].substring(key[depth].lastIndexOf("[") + 1, key[depth].lastIndexOf("]")));
                result = listValue.get(index);
            } else {
                //处理key:value
                Gson gson = new Gson();
                Map map = gson.fromJson(result.toString(), Map.class);
                result = map.get(key[depth]);
            }
            depth++;
        }
        System.out.println(result);
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值