java 簡單樹轉換成複雜樹

前端現在都支持簡單樹了,有些需求我們還是需要用到複雜樹的(比如把子父數據分別放在兩張表的時候)

網上看了一下,網上的便利效率都不高,會循環很多次主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表達式其實就是語法糖而已,減少代碼而已,效率並沒有提高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章