我们面试的时候,会遇到这样的笔试题目: 如下面的数据
1 1 1 1 1
2 1 2 2 2
3 1 3 3 3
4 2 4 4 4
5 3 5 5 5
让你简单的设计一下,实现树结构
其实也就是 id 和 pid 的问题,多的不说,直接上代码,
哈哈,拙见,有不足之处请大家指出:
首先是一个测试类(也是一个实体类)保存你的数据(可以是从数据库中查出来的数据),我简单的设置了几个字段,如有需要可自己根据实际情况而定
public class Test {
private String id;
private String pid;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后是一个为了构造树的一个实体类 ;
稍微解释一下,里面的children 字段,主要是保存这个对象的孩子的(哈哈,习惯这样说)也就是他的子节点;
public class TestTree {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<TestTree> getChildren() {
return Children;
}
public void setChildren(List<TestTree> children) {
Children = children;
}
private String pid;
private String name;
private List<TestTree> Children;
public TestTree() {
Children = new ArrayList<TestTree>();
}
@Override
public String toString() {
return "TestTree [id=" + id + ", pid=" + pid + ", name=" + name + ", Children=" + Children + "]";
}
}
再然后就是为了构造这个树的方法了,方法很简单,还有一些别的更好的方法,这里就不做了,献上我自己的拙见:
这个方法也很简单,首先是有一个根,然后把你的数据放到一个map集合里面去,主要是下面的放孩子进去,也是遍历你的数据
当它没有pid的时候它就是一个根节点,有pid 的时候,就把它对应的数据放到孩子里面去
public class RunTree {
public List<TestTree> doBuild(List<Test> data) {
List<TestTree> nodes = new ArrayList<TestTree>();
TestTree testTree = new TestTree();
testTree.setId("1");
testTree.setName("根");
nodes.add(testTree);
Map<String,Object> map = new HashMap<>();
//加载节点
for (Test model:data) {
TestTree treeone = new TestTree();
treeone.setId(model.getId());
if (model.getPid() != null && model.getPid() != "") {
treeone.setPid(model.getPid());
}
treeone.setName(model.getName());
map.put(model.getId(), treeone);
}
//放孩子进去
for (Test model:data) {
String id = model.getId();
String pid = model.getPid();
if (pid.equals(null) || pid.equals("")) {
testTree.getChildren().add((TestTree)map.get(id));
}else {
TestTree treetwo = new TestTree();
treetwo =(TestTree)map.get(pid);
if (treetwo != null) {
treetwo.getChildren().add((TestTree)map.get(id));
}
}
}
return nodes;
}
}
下面再来一个小小的测试:
public class TestMain {
public static void main(String[] args) {
Test t = new Test();
t.setId("1");
t.setName("1");
t.setPid("");
Test t1 = new Test();
t1.setId("2");
t1.setName("2");
t1.setPid("1");
Test t2 = new Test();
t2.setId("3");
t2.setName("3");
t2.setPid("2");
List<Test> list = new ArrayList<>();
list.add(t2);
list.add(t1);
list.add(t);
RunTree run = new RunTree();
List<TestTree> result = run.doBuild(list);
System.out.println(result.toString());
}
}
好了,大致就是这样,希望对你有所帮助