题目描述:输入jsonData 和columns数组, 将折叠过后的json数据展开变成一个扁平化的json数据, input: JSON apiData, String[] columns, output: List
public List<HashTable<String,String>> getResults(Json apiData,String columns){ List<HashTable<String,String>> res = new ArrayList<>(); if(apiData==null||columns==null) return res; dfs(apiData,columns,res,0); return res; } public List<HashTable<String,String>> dfs(Json apiData,String[] columns,List<HashTable<String,String>> res, int index,HashTable<String,String> path){ //base case的递归出口 第一种情况是apiData返回的是jsonString这个时候,尽管columns数组还没有走到尽头,但是该层的结果集已经不能继续往下dfs了,所以我们需要将该结果加进results里面,之后进行backtracking 因为dfs这一支走完了之后,需要删掉最后一个hashtable<String,String>,继续保留原来的path走另外一个分支 if(apidata.type()==jsonString){ path.put(columns[index],keys[i]); res.add(new HashMap<String,String>(path)) path.remove(columns[i]); } //base case 当递归的深度达到 columns的length的时候,就可以将path加入到results里面 if(index==columns.length){ res.add(new HashTable<String,String> path); } String[] keys = apidata.keys()// //用APi所给的方法,去取得该jsonMapping类里面所对应的keys数组 ,对所有的keys进行遍历,讲改keys[i] 与columns[index]一一对饮 for(int i=0;i<keys.length,i++){ //为什么for循环里面是一个dfs函数,因为每次讲对应的key value pair放进HashTable里面的时候,相当于刚走完一个root节点,之后还要对该root节点调用dfs函数 沿着分支往下走 backtrakcing的时候要remove掉column[index]的原因是因为 for example:当我们country对应的US走完了之后,我们要走GM所以US的应该删了 path.put(columns[index],keys[i]) dfs(apiData.get(key[i]),columns,res,index+1,path path.remove(columns[index]); } if(apiData.type()){ JSON json = apiData.get(column); String[] keys= apiData.keys; }_ } }_