1

ハッシュマップのリストをループして、構造のようなツリーを形成しようとしています。入力 (ハッシュマップのリスト) と目的の出力 (ハッシュマップのリスト) は次のとおりです。

入力:

[{State=Tamil Nadu, Continent=Asia, Country=India, City=Chennai}, {State=Kerala, Continent=Asia, Country=India, City=Cochin}, {State=Tamil Nadu, Continent=Asia, Country=India, City=Madurai}, {State=Something, Continent=Asia, Country=Srilanka, City=Colombo}, {State=anythig, Continent=Africa, Country=South Africa, City=new}]

期待される結果:

[{children=[{children=[{State=Tamilnadu, children=[{City=Madurai}, {City=Chennai}]}, {State=Kerala, children=[{City=Cochin}]}], Country=India}, {Country=Srilanka}], Continent=Asia}, {Continent=Africa}]

(スリランカもアフリカも同じ構造だと思ってください。サンプルなので追加はしていません)

主な目的は、以下のようなツリーのような構造を形成することです。

  Asia
    India
      TamilNadu
        Chennai
        Madurai
      Kerala
        Cochin
    Srilanka
      Something
        Colombo
  Africa
    South Africa
      Anything
        new

すべてのデータは動的であり、指定された唯一の入力は"Continent, Country, State, City"、都市が州の下に、州が国の下にあるという意味のようなグループの順序になります。以下のコードで試したのは、入力リストを検索し、最初に都市を取得し、都市の地図を作成してから、地図に各都市の値が含まれているインデックスリストを見つけて州を取得し、それらを追加することですマップを作成しchildren、マップの最終的なリストとして重要なキー(再帰的な方法で実行することを考えましたが、アイデアを得ることができませんでした)がツリーのjson入力に変換される状態の下に、対応する都市を追加しますお店。これはJavaコードで行う必要があり、私はそれで打たれました。誰かがサンプルまたはポインタを提供できますか...

public void recursiveSearch(List<Map<String, String>> inputList){
    String groupOrder = "Continent, Country, State, City";
    String[] splitList = groupOrder.split(",");
    Map finalMap = new HashMap();
    for(int i= splitList.length-1; i >= 0; i--){
        //int index = 0;
        List searchList = new ArrayList();
        String keyToSearch= splitList[i].trim();
        for (Map<String, String> map : inputList) {

        String searchVal= map.get(keyToSearch);
        //index =  inputList.indexOf(map);
        //System.out.println(index);
        if(!searchList.contains(searchVal)){
            searchList.add(searchVal);
        }
        //System.out.println(searchVal);
    }
    if(searchList.size() > 0){
        Map allSearchMap = new HashMap();
        Map indSearchMap= new HashMap();
        for(int j=0; j < searchList.size(); j++ ){
            int index = 0;
            //System.out.println(splitList[splitList.length-1] +" "+ keyToSearch);
            if(((splitList[splitList.length-1]).trim()).equalsIgnoreCase(keyToSearch)){

              Map indexMap = new HashMap();
              for (Map<String, String> newMap : inputList) {

                    boolean result= newMap.containsValue(searchList.get(j));
                    if(result){
                        index =  inputList.indexOf(newMap);
                        System.out.println(searchList.get(j)+ " "+index);
                    }


                }
              indexMap.putAll(inputList.get(index));
              if(indexMap != null){
                  if(!indSearchMap.containsValue(searchList.get(j))){
                  indSearchMap.put(keyToSearch, searchList.get(j));
                  }
                  allSearchMap.put(keyToSearch+j, indSearchMap);
                  if(i-1 >= 0){
                  String parent = (String) indexMap.get(splitList[i-1].trim());

                  finalMap.put(splitList[i-1].trim(), parent);
                  finalMap.put("children", allSearchMap.get(keyToSearch+j));
                  //System.out.println(index+ " "+searchList.get(j)+" "+indexMap.get(splitList[i-1].trim()));
                  }
              }

            }



    }
}
}
System.out.println("--->"+finalMap.toString());

}

NOTE: The data and the group order are dynamic and can be of anything or any count.
4

1 に答える 1