java - 递归重构对象结构
问题描述
我有一个“HashMap> map”,它代表一个类似于目录树的对象树,其中父目录可以获取更多的子子目录等等。列表中的值也可以表示父级。
Map 包含例如以下键/值对:
map.put(obj1, [obj2, obj3, obj4, obj5])
map.put(obj2, [obj6, obj7, obj8, obj9])
map.put(obj6, [obj10, obj11, obj12, obj13])
map.put(obj10, [])
如果我现在编码:
List children = map.get(obj1);
for(Object child : children){
obj1.add(child);
}
我得到以下对象结构:
obj1--
|
obj2
|
obj3
|
obj3
|
obj5
这就是我的知识结束的地方,因为我编程的时间不长。我知道我有递归代码来获得正确的对象结构,例如:
obj1--
|
obj2--
| |
| obj6--
| | |
| obj7 obj10
| | |
| obj8 obj11
| | |
| obj9 obj12
|
|
obj3
|
obj3
|
obj5
我正在努力实现一个递归工作代码,该代码在循环中重建对象结构。
如果有人可以带我走正确的路或者可以提供一个小例子,那将是非常好的。
提前感谢约翰
解决方案
尝试这个:
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class So53579861_recursively_reconstruct_object_structure {
static String indent() {
String string="";
for(int i=0;i<4*indent;i++)
string+=" ";
return string;
}
static void visit(Map<Object,List<Object>> map,Object key) {
System.out.println(indent()+key);
List<Object> list=map.get(key);
++indent;
if(list!=null)
for(Object object:list)
visit(map,object);
--indent;
}
public static void main(String[] args) {
visit(map,list.get(0));
}
static int indent;
static List<Object> list=new ArrayList<>();
static {
for(int i=1;i<=13;i++)
list.add(new Integer(i));
System.out.println(list);
}
static Map<Object,List<Object>> map=new LinkedHashMap<>();
static {
List<Object> children=new ArrayList<>();
for(int i=2;i<=5;i++)
children.add(list.get(i-1));
map.put(list.get(1-1),children);
children=new ArrayList<>();
for(int i=6;i<=9;i++)
children.add(list.get(i-1));
map.put(list.get(2-1),children);
children=new ArrayList<>();
for(int i=10;i<=13;i++)
children.add(list.get(i-1));
map.put(list.get(6-1),children);
children=new ArrayList<>();
map.put(list.get(10-1),children);
children=new ArrayList<>();
System.out.println(map);
}
}
推荐阅读
- swift - 从函数内的各种循环中返回一个值
- sql - SQL 查询总和(CASE、WHEN、ELSE)
- ios - Xcode 未在 iPA 中捆绑所有启动图像
- javascript - 需要在非 es6-javascript 字符串中提取间接定义的变量名称的基于正则表达式的方法
- sql-server - 使用 onguard 系统访问控制数据库为夜班工作人员提供的时间
- javascript - 如何从外部链接打开 bootstrap 3 选项卡?
- jquery - 在 JQuery POST 方法中添加 DataType 属性
- react-native - “react-native init project”命令不起作用
- c - 为什么 itoa 被声明为不安全?
- java - 如何在 Java 中解码从 Azure 获取的 SAML 令牌?