ハッシュマップのリストをループして、構造のようなツリーを形成しようとしています。入力 (ハッシュマップのリスト) と目的の出力 (ハッシュマップのリスト) は次のとおりです。
入力:
[{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.