Json DFS parse(PG)

JSON format Data
{
"GB": {
"birmington": {"apple": "20", "google": "50", ....},. more info on 1point3acres.com
"london": {"apple": "110", "google": "70", ....},
.....
},

"US": {
"new york": {"apple": "100", "google": "200", ....},
"san francisco": {"apple": "150", "google": "50", ....},
},
....
....
}
columns: ['country', 'city', 'store', 'rev']
output:
[{"city": "london", "country": "GB", "rev": "70", "store": "google"},
{"city": "london", "country": "GB", "rev": "110", "store": "apple"},
{"city": "birmington", "country": "GB", "rev": "50", "store": "google"},
{"city": "birmington", "country": "GB", "rev": "20", "store": "apple"},
{"city": "san francisco", "country": "US", "rev": "50", "store": "google"}, ....]

m cols n row
input: JSON apiData, String[] columns
output: List<Hashtable<String, String>>

class JSON {      // base class for json data type
 public JSON(String json); // constructor
 public String toString(); // convert json data type to   string that can be printed
public String type(); // return type. 1point 3acres 璁哄潧
}
class JSONMapping extend JSON {
   public JSON get(String key); // return value   corresponding to the key
   public String[] keys(); // return all the keys
   public String type() {return "JSONMapping";}
}
class JSONString extend JSON {
   public String value(); // return the stringpublic String type() {
    return "JSONString";
  }


题目描述:输入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<StringString> 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;
        }_
    }
}_
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值