import java.util.List;
/**
* @Description 泛型接口
* `T`:通常用来表示节点的标识符(ID)的类型。例如,如果树中的每个节点都有一个唯一的整数ID,那么 `T` 可能是 `Integer` 类型。
* `K`:通常用来表示节点的子节点类型。
* 在一个典型的树结构中,子节点也是树节点的类型,因此 `K` 通常与 `TreeNode<T, K>` 本身类型相同,但也可以是任何其他类型。
*/
public interface TreeNode<T,K> {
T getParentID();
T getId();
List<K> getChildren();
void setChildren(List<K> list);
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @Description 树状结构生成工具类
* <p>
*/
public class TreeUtil {
private TreeUtil() {
}
public static <T extends TreeNode> List<T> toObjTree(Collection<T> list) {
List<T> result = Lists.newArrayList();
Map<Object,T> map = list.stream().collect(Collectors.toMap(T::getId,Function.identity()));
list.forEach(t->{
if(map.containsKey(t.getPid())){
if(map.get(t.getParentID()).getChildren()==null){
map.get(t.getParentID()).setChildren(Lists.newArrayList());
}
map.get(t.getParentID()).getChildren().add(t);
}else {
result.add(t);
}
});
return result;
}
public static <T extends TreeNode> JSONArray toTree(Collection<T> list) {
return toTree(list, "id", "parentID", "children");
}
public static <T extends TreeNode> JSONArray toTree(Collection<T> list, String id, String parentID, String children) {
return listToTree(JSONArray.parseArray(JSON.toJSONString(list)), id, parentID, children);
}
public static <PlainArea> JSONArray toTreeArea(Collection<PlainArea> list) {
return listToTree(JSONArray.parseArray(JSON.toJSONString(list)), "id", "parentId", "children");
}
/**
* listToTree
* <p>方法说明<p>
* 将JSONArray数组转为树状结构
*
* @param arr 需要转化的数据
* @param id 数据唯一的标识键值
* @param parentID 父id唯一标识键值
* @param child 子节点键值
* @return JSONArray
*/
public static JSONArray listToTree(JSONArray arr, String id, String parentID, String child) {
JSONArray ar = new JSONArray();
JSONObject hash = new JSONObject();
//将数组转为Object的形式,key为数组中的id
for (int i = 0; i < arr.size(); i++) {
JSONObject json = (JSONObject) arr.get(i);
hash.put(json.getString(id), json);
}
//遍历结果集
for (int j = 0; j < arr.size(); j++) {
//单条记录
JSONObject aVal = (JSONObject) arr.get(j);
//在hash中取出key为单条记录中pid的值
JSONObject hashVP = (JSONObject) hash.get(aVal.get(parentID).toString());
//如果记录的parentID存在,则说明它有父节点,将她添加到孩子节点的集合中
if (hashVP != null) {
//检查是否有child属性
if (hashVP.get(child) != null) {
JSONArray ch = (JSONArray) hashVP.get(child);
ch.add(aVal);
hashVP.put(child, ch);
} else {
JSONArray ch = new JSONArray();
ch.add(aVal);
hashVP.put(child, ch);
}
} else {
ar.add(aVal);
}
}
return ar;
}
}
此工具了,通过传输入的集合,可以找到对应的父类以及子类集合