问 题 描述: |
问题描述 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,可以用来描述半结构化的数据。JSON 格式中的基本单元是值 (value),出于简化的目的本题只涉及 2 种类型的值: 输入格式 第一行是两个正整数 n 和 m,分别表示 JSON 数据的行数和查询的个数。 输出格式 对于输入的每一个查询,按顺序输出查询结果,每个结果占一行。 样例输入 10 5 样例输出 STRING John 评测用例规模与约定 n ≤ 100,每行不超过 80 个字符。 |
package jsonQuery;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
// 思路:将所有Json语句整合成一条字符串,并去除空格.使用数组来模拟栈结构,
// 每出现{数组下标递增即为压栈,每出现}数组下标递减,即为弹栈,以此来判别层级
@SuppressWarnings({ "resource" })
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();// Json数据的行数
int m = sc.nextInt();// 待查询key个数
StringBuilder JsonData = new StringBuilder();// 存储所有Json语句
sc.nextLine();
for (int i = 0; i < n; i++)
JsonData.append(sc.nextLine().replace(" ", ""));// 去除所有空格方便进行操作
Map<String, String> nodes = new HashMap<String, String>();
String[] stack = new String[100];// 模拟栈
stack[0] = "rootNode";// 根节点
int level = 1;// 当前层级,初始值为1
String[] result = new String[m];// 存储输出结果
String key = "null", value = "null";
boolean isKey = true;// 判断下一引号内是否为键值
for (int i = 1; i < JsonData.length(); i++) {
switch (JsonData.charAt(i)) {
case '"':
StringBuilder temp = new StringBuilder();// 暂时保存引号中的字符串
boolean flag = true;// 循环结束标记
while (flag) {
i++;
switch (JsonData.charAt(i)) {
case '\\':// 若为转义字符跳过此字符
i++;
temp.append(JsonData.charAt(i));
break;
case '"':// 若为引号则此字符串结束
flag = false;
break;
default:
temp.append(JsonData.charAt(i));
break;
}
}
if (isKey) {
key = temp.toString();// 获取键
if (level - 1 != 0)// 判断前一层级是否存在
key = stack[level - 1] + "." + key;// 存在则加上前缀
} else {
value = temp.toString();// 获取值
nodes.put(key, "STRING " + value);
}
break;
case '{':// 遇到{则对象为键值对,层级上升
stack[level] = key;// 压栈
nodes.put(key, "OBJECT");
level++;
isKey = true;
break;
case ',':
isKey = true;
break;// 下一字符串为键
case '}':
level--;
break;
case ':':
isKey = false;
break;// 下一字符串为值
}
}
for (int i = 0; i < m; i++)// 读取查询内容
{
String query = sc.nextLine();
if ((result[i] = nodes.get(query)) == null)// 判断对应的键是否非空且存在
result[i] = "NOTEXIST";
}
for (String str : result)
System.out.println(str);
}
}