前端現在都支持簡單樹了,有些需求我們還是需要用到複雜樹的(比如把子父數據分別放在兩張表的時候)
網上看了一下,網上的便利效率都不高,會循環很多次主List數據,所以就自己寫了一個。
上代碼:
package com.example.demo;
import java.util.ArrayList;
import java.util.List;
/**
*樹形結構封裝類
*/
public class Data {
String id;
String pid;
String name;
List<Data> datas = new ArrayList<Data>();
public Data() {
super();
// TODO Auto-generated constructor stub
}
public Data(String id, String pid, String name) {
super();
this.id = id;
this.pid = pid;
this.name = name;
}
public List<Data> getDatas() {
return datas;
}
public void setDatas(List<Data> datas) {
this.datas = datas;
}
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;
}
@Override
public String toString() {
return "data [id=" + id + ", pid=" + pid + ", name=" + name + "]";
}
}
生成樹的方法,不會多次遍歷數據。主數據只遍歷 < 2次,主要看你主id排序的位置。
package com.example.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.springframework.beans.BeanUtils;
import com.alibaba.fastjson.JSON;
public class JavaTest {
public static void main(String[] args) {
List<Data> arrayList = new ArrayList<Data>();
arrayList.add(new Data("1","0","1"));
arrayList.add(new Data("2","1","2"));
arrayList.add(new Data("3","2","3"));
arrayList.add(new Data("4","2","4"));
arrayList.add(new Data("5","2","5"));
arrayList.add(new Data("6","3","6"));
Data data = new Data();
getData(data,arrayList);
System.out.println(JSON.toJSONString(data));
}
//父節點字段名稱
public static String PID = "pid";
//節點id
public static String ID = "id";
//主節點id
public static String treeOne = "0";
public static void getData(Data data,List<Data> list){
Iterator<Data> iterator = list.iterator();
if(data.getId() == null){
//如果不存在數據
String pid = treeOne;
while (iterator.hasNext()) {
Data next = iterator.next();
if(pid.equals(next.getPid())){
//如果是主節點
BeanUtils.copyProperties(next, data);
iterator.remove();
break;
}
}
getData(data,list);
}else{
//如果存在數據
String pid = data.getId();
List<Data> datas = data.getDatas();
while (iterator.hasNext()) {
Data next = iterator.next();
if(pid.equals(next.getPid())){
//如果是主節點
datas.add(next);
iterator.remove();
}
}
//遍歷添加
for (Data da : datas) {
if(list.size() > 0){
getData(da,list);
}
}
}
}
}
以上,代碼粘貼即可用。
如果你有效率更高的算法請告訴我,順嘴提一句什麼java8 Lambda表達式其實就是語法糖而已,減少代碼而已,效率並沒有提高。