- 这道题本来是想要用更优雅的代码的,但是带花括号的话,还是用递归吧
10 5
{
"firstName": "John",
"lastName": "Smith",
"address": {
"streetAddress": "2ndStreet",
"city": "NewYork",
"state": "NY"
},
"esc\\aped": "\"hello\""
}
firstName
address
address.city
address.postal
esc\aped
STRING John
OBJECT
STRING NewYork
NOTEXIST
STRING "hello"
import java.io.*;
import java.util.*;
public class Main {
@SuppressWarnings("unchecked")
private static String query(String key, Map<String, Object> map) {
String[] arr = key.split("\\.");
for (int i = 0; i < arr.length; i++) {
if (!map.containsKey(arr[i])) {
return "NOTEXIST";
}
Object obj = map.get(arr[i]);
if (i + 1 == arr.length) {
if (obj instanceof String)
return "STRING " + (String) obj;
else
return "OBJECT";
}
else {
if (obj instanceof Map)
map = (Map<String, Object>) obj;
else
return "NOTEXIST";
}
}
return null;
}
private static Map<String, Object> DFS(String json, int beginIndex, int endIndex) {
Map<String, Object> map = new HashMap<>();
boolean isKey = true;
String key = null;
for (int i = beginIndex; i < endIndex; i++) {
switch (json.charAt(i))
{
case '\"':
int j = i + 1;
while (j < endIndex && json.charAt(j) != '\"') {
if (json.charAt(j) == '\\') j++;
j++;
}
if (isKey) {
key = json.substring(i + 1, j)
.replace("\\\\", "\\")
.replace("\\\"", "\"");
} else {
String val_str = json.substring(i + 1, j)
.replace("\\\\", "\\")
.replace("\\\"", "\"");
map.put(key, val_str);
}
isKey = !isKey;
i = j;
break;
case '{':
Map<String, Object> val_map = DFS(json, i + 1, endIndex);
map.put(key, val_map);
i = (Integer) val_map.get(null);
isKey = !isKey;
break;
case '}':
map.put(null, i);
return map;
}
}
return map;
}
public static void main(String[] args) throws IOException {
BufferedReader f = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
StringTokenizer st = new StringTokenizer(f.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append(f.readLine());
}
Map<String, Object> map = DFS(sb.toString(), 1, sb.length() - 1);
for (int i = 0; i < m; i++) {
String key = f.readLine();
String value = query(key, map);
out.println(value);
}
out.close();
f.close();
}
}