package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* IdPIdDatasToTree
*
Author : td
*
Date : 2016年9月30日下午4:54:59
*
Desc : 将上下级数据加工成为tree形数据结构
* @param response
* @param request
*/
public class IdPIdDatasToTree {
public static void main(String[] args) {
List < Map < String, Object >> list = new ArrayList < Map < String, Object >> ();
Map < String, Object > m = null;
for (int i = 1; i < 10; i++) {
m = new HashMap < String, Object > ();
m.put("id", i + "");
m.put("name", "我是节点" + i);
m.put("parentId", i - 1 + "");
list.add(m);
}
List < Map < String, Object >> treeMenuList = new LinkedList < Map < String, Object >> ();
treeMenuList = treeMenuList(list, treeMenuList, "0");
System.out.println("要加工的数据为:" + list.toString());
System.out.println("加工好的tree状结构为:" + treeMenuList.toString());
}
/**
*
* @param menuList 原始数据
* @param treeMenuList tree数据对象
* @param parentId 数据的父id
* @return
*/
@SuppressWarnings("unchecked")
public static List < Map < String, Object >> treeMenuList(List < Map < String, Object >> list, List < Map < String, Object >> treeMenuList, String parentId) {
//没有根节点情况下
if ("0".equals(parentId)) {
treeMenuList = getChildNodeList("0", list);
for (Map < String, Object > treeMenu: treeMenuList) {
String id = (String) treeMenu.get("id");
treeMenu.put("childNode", getChildNodeList(id, list));
treeMenuList(list, treeMenuList, id);
}
} else {
for (Map < String, Object > treeMenu: treeMenuList) {
//判断是否有子元素,有的话递归子元素 继续判断
String id = (String) treeMenu.get("id");
if (treeMenu.containsKey("childNode")) {
//获取子元素
List < Map < String, Object >> childNodeList = (List < Map < String, Object >> ) treeMenu.get("childNode");
if (childNodeList != null && childNodeList.size() > 0) {
for (Map < String, Object > tMenu: childNodeList) {
treeMenuList(list, childNodeList, tMenu.get("id").toString());
}
}
//如果没有子元素,根据id查询儿子 将儿子赋值
} else {
List < Map < String, Object >> chList = getChildNodeList(id, list);
if (null != chList) {
treeMenu.put("childNode", chList);
treeMenuList(list, chList, id);
}
}
}
}
return treeMenuList;
}
/**
*
* @param parentId 数据父id
* @param list 原始数据
* @return
*/
public static List < Map < String, Object >> getChildNodeList(String parentId, List < Map < String, Object >> list) {
List < Map < String, Object >> childNodeList = new LinkedList < Map < String, Object >> ();
for (Map < String, Object > childNode: list) {
//从新new 对象 (如果不重新new对象,list 的值会随之变动,不知道咋回事?)
Map < String, Object > m = new HashMap < String, Object > ();
m.putAll(childNode);
String pId = (String) childNode.get("parentId");
if (pId.equals(parentId)) {
childNodeList.add(m);
}
}
if (childNodeList.size() == 0) return null;
return childNodeList;
}
}