标题
按路径读取配置的值
<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 = "";
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<Object> listValue = (List<Object>) result;
Integer index = Integer.valueOf(key[depth].substring(key[depth].lastIndexOf("[") + 1, key[depth].lastIndexOf("]")));
result = listValue.get(index);
} else {
Gson gson = new Gson();
Map map = gson.fromJson(result.toString(), Map.class);
result = map.get(key[depth]);
}
depth++;
}
System.out.println(result);
return result;
}
}