使用java递归搜索哈希映射列表中的值
我正在尝试循环遍历一个hashmaps列表并形成一个树状结构。输入(hashmaps列表)和所需输出(hashmaps列表)如下所示: 输入:使用java递归搜索哈希映射列表中的值,java,list,recursion,hashmap,Java,List,Recursion,Hashmap,我正在尝试循环遍历一个hashmaps列表并形成一个树状结构。输入(hashmaps列表)和所需输出(hashmaps列表)如下所示: 输入: [{State=Tamil Nadu, Continent=Asia, Country=India, City=Chennai}, {State=Kerala, Continent=Asia, Country=India, City=Cochin}, {State=Tamil Nadu, Continent=Asia, Country=India, Ci
[{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}]
(请考虑,即使是Srilanka和非洲也应该有相同的结构。我没有补充,因为它的样本)
主要目的是形成树状结构,如下所示: Asia
India
TamilNadu
Chennai
Madurai
Kerala
Cochin
Srilanka
Something
Colombo
Africa
South Africa
Anything
new
所有数据都是动态的,唯一给定的输入将是组顺序,就像“大陆、国家、州、城市”
意味着城市在州之下,州在国家之下等等。我在下面的代码中尝试的是搜索输入列表,首先获取城市,形成城市地图,然后找到索引列表,其中地图包含每个城市的值,并获取状态,将它们添加到地图中,并将相应的城市添加到键子项所属的状态下(我想用递归的方式来做,但没有办法)这一点很重要,因为最终的映射列表将被转换为树存储的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());
试试这个
public class MyObjectClass implements Comparable<MyObjectClass> {
private String continent;
private String country;
private String state;
private String city;
public MyObjectClass(String continent) {
this.continent = continent;
}
public String getContinent() {
return continent;
}
public void setContinent(String continent) {
this.continent = continent;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public int compareTo(MyObjectClass o) {
if (this.continent.compareTo(o.continent) > 0)
return 1;
else if (this.continent.compareTo(o.continent) < 0)
return -1;
else
return 0;
}
}
公共类MyObjectClass实现了可比较的{
非洲大陆;
私人国家;
私有字符串状态;
私人城市;
公共MyObject类(字符串){
这个大陆=大陆;
}
公共字符串getContinental(){
返回大陆;
}
公共区域(字符串区域){
这个大陆=大陆;
}
公共字符串getCountry(){
返回国;
}
公共国家/地区(字符串国家/地区){
这个国家=国家;
}
公共字符串getState(){
返回状态;
}
公共无效设置状态(字符串状态){
this.state=状态;
}
公共字符串getCity(){
回归城市;
}
公共城市(字符串城市){
this.city=城市;
}
@凌驾
公共整数比较(MyObject o类){
如果(本大陆与(邻大陆)相比>0)
返回1;
如果(这个大陆)与(o大陆)相比<0
返回-1;
其他的
返回0;
}
}
然后是我的主课。这将返回你的预期输出
import java.util.*;
public class MyMain {
public static void main(String[] args) {
List<MyObjectClass> list=new ArrayList<>();
MyObjectClass myObj1=new MyObjectClass("Asia");
myObj1.setCountry("Sri Lanka");
myObj1.setState("Western");
myObj1.setCity("Colombo");
MyObjectClass myObj2=new MyObjectClass("Africa");
myObj2.setCountry("South Africa");
myObj2.setState("Anything");
myObj2.setCity("new");
MyObjectClass myObj3=new MyObjectClass("Asia");
myObj3.setCountry("India");
myObj3.setState("Tamil Nadu");
myObj3.setCity("Chennai");
MyObjectClass myObj4=new MyObjectClass("Asia");
myObj4.setCountry("India");
myObj4.setState("Kerala");
myObj4.setCity("Cochin");
list.add(myObj1);
list.add(myObj2);
list.add(myObj3);
list.add(myObj4);
Collections.sort(list);
String tempCont=new String();
String tempCount=new String();
String tempState=new String();
for(MyObjectClass i:list){
if(tempCont.equals(i.getContinent())){
if(tempCount.equals(i.getCountry())){
if (tempState.equals(i.getState())){
System.out.println("-------------------------"+i.getCity());
}
else {
tempState=i.getState();
System.out.println("----------------"+tempState);
System.out.println("-------------------------"+i.getCity());
}
}
else {
tempCount=i.getCountry();
System.out.println("--------"+tempCount);
System.out.println("----------------"+i.getState());
System.out.println("-------------------------"+i.getCity());
}
}
else {
tempCont=i.getContinent();
System.out.println(tempCont);
System.out.println("--------"+i.getCountry());
System.out.println("----------------"+i.getState());
System.out.println("-------------------------"+i.getCity());
}
}
}
}
import java.util.*;
公共类MyMain{
公共静态void main(字符串[]args){
列表=新的ArrayList();
MyObjectClass myObj1=新的MyObjectClass(“亚洲”);
myObj1.setCountry(“斯里兰卡”);
myObj1.setState(“西部”);
myObj1.塞特城(“科伦坡”);
MyObjectClass myObj2=新的MyObjectClass(“非洲”);
myObj2.setCountry(“南非”);
myObj2.设置状态(“任何”);
myObj2.设定城市(“新”);
MyObjectClass myObj3=新的MyObjectClass(“亚洲”);
myObj3.setCountry(“印度”);
myObj3.setState(“泰米尔纳德邦”);
myObj3.塞特城(“钦奈”);
MyObjectClass myObj4=新的MyObjectClass(“亚洲”);
myObj4.国家(“印度”);
myObj4.setState(“喀拉拉邦”);
myObj4.赛特城(“科钦”);
添加列表(myObj1);
添加列表(myObj2);
添加列表(myObj3);
增加(myObj4);
集合。排序(列表);
String tempCont=新字符串();
字符串tempCount=新字符串();
String tempState=新字符串();
对于(MyObject i类:列表){
if(tempCont.equals(i.getContinental())){
if(tempCount.equals(i.getCountry())){
if(tempState.equals(i.getState())){
System.out.println(“---------------------------”+i.getCity());
}
否则{
tempState=i.getState();
System.out.println(“-----------------------”+tempState);
System.out.println(“---------------------------”+i.getCity());
}
}
否则{
tempCount=i.getCountry();
系统输出打印项次(“----------”+临时计数);
System.out.println(“-----------------------”+i.getState());
System.out.println(“---------------------------”+i.getCity());
}
}
否则{
tempCont=i.getContinental();
系统输出打印LN(临时控制);
System.out.println(“----------”+i.getCountry());
System.out.println(“-----------------------”+i.getState());
System.out.println(“---------------------------”+i.getCity());
}
}
}
}
Hi Ruchira..感谢您的回复。groupOrder
将是动态的,可以是任何计数或任何数据。因此,我将无法形成getter和setter方法。而且,最终结果必须是我的问题中提到的映射,如下面的一个…[{children=[{children children]=[{州=泰米尔纳德邦,儿童=[{市=马杜赖,{市=钦奈]},{州=喀拉拉邦,儿童=[{市=科钦]}],国家=印度},{国家=斯利兰卡},大陆=亚洲},{大陆=非洲}]
import java.util.*;
public class MyMain {
public static void main(String[] args) {
List<MyObjectClass> list=new ArrayList<>();
MyObjectClass myObj1=new MyObjectClass("Asia");
myObj1.setCountry("Sri Lanka");
myObj1.setState("Western");
myObj1.setCity("Colombo");
MyObjectClass myObj2=new MyObjectClass("Africa");
myObj2.setCountry("South Africa");
myObj2.setState("Anything");
myObj2.setCity("new");
MyObjectClass myObj3=new MyObjectClass("Asia");
myObj3.setCountry("India");
myObj3.setState("Tamil Nadu");
myObj3.setCity("Chennai");
MyObjectClass myObj4=new MyObjectClass("Asia");
myObj4.setCountry("India");
myObj4.setState("Kerala");
myObj4.setCity("Cochin");
list.add(myObj1);
list.add(myObj2);
list.add(myObj3);
list.add(myObj4);
Collections.sort(list);
String tempCont=new String();
String tempCount=new String();
String tempState=new String();
for(MyObjectClass i:list){
if(tempCont.equals(i.getContinent())){
if(tempCount.equals(i.getCountry())){
if (tempState.equals(i.getState())){
System.out.println("-------------------------"+i.getCity());
}
else {
tempState=i.getState();
System.out.println("----------------"+tempState);
System.out.println("-------------------------"+i.getCity());
}
}
else {
tempCount=i.getCountry();
System.out.println("--------"+tempCount);
System.out.println("----------------"+i.getState());
System.out.println("-------------------------"+i.getCity());
}
}
else {
tempCont=i.getContinent();
System.out.println(tempCont);
System.out.println("--------"+i.getCountry());
System.out.println("----------------"+i.getState());
System.out.println("-------------------------"+i.getCity());
}
}
}
}