1. 程式人生 > 其它 >Java 構建樹狀結構工具類

Java 構建樹狀結構工具類

@Slf4j
public class TreeUtils {

  // 預設 id 欄位名
private static final String ID_DEFAULT_FIELD = "id";
  // 預設 父級欄位名
private static final String PARENT_DEFAULT_FIELD = "parentId";
  // 預設 子級欄位名
private static final String CHILDREN_DEFAULT_FIELD = "children"; /** * 構建樹狀結構 * * @param
list 原資料集 * @param parentId 父級欄位名 * @param id id欄位名 * @param children 子級欄位名 * @param clazz 資料實體 * @param <T> 泛型 * @return 樹狀結構 */ public static <T> List<T> buildTree(List<T> list, String parentId, String id, String children, @NotNull Class clazz) {
if (StringUtils.isEmpty(list)) { return null; } // 如果被依賴欄位名稱為空則預設為id if (StringUtils.isEmpty(id)) { id = ID_DEFAULT_FIELD; } // 如果依賴欄位為空則預設為 parentId if (StringUtils.isEmpty(parentId)) { parentId = PARENT_DEFAULT_FIELD; }
// 如果子節點集合屬性名稱為空則預設為children if (StringUtils.isEmpty(children)) { children = CHILDREN_DEFAULT_FIELD; } try { // 獲取 id 欄位, 從當前物件或其父類 Field idField; try { idField = clazz.getDeclaredField(id); } catch (NoSuchFieldException e1) { idField = clazz.getSuperclass().getDeclaredField(id); } // 獲取 parentId 欄位, 從當前物件或其父類 Field parentField; try { parentField = clazz.getDeclaredField(parentId); } catch (NoSuchFieldException e1) { parentField = clazz.getSuperclass().getDeclaredField(parentId); } // 獲取 children 欄位, 從當前物件或其父類 Field childrenField; try { childrenField = clazz.getDeclaredField(children); } catch (NoSuchFieldException e1) { childrenField = clazz.getSuperclass().getDeclaredField(children); } // 設定為可訪問 idField.setAccessible(true); parentField.setAccessible(true); childrenField.setAccessible(true); return buildTree(list, parentField, idField, childrenField); } catch (Exception e) { log.error("構建樹狀結構異常:", e); throw new ServiceException("服務繁忙,請稍後再試"); } } /** * 構建樹狀結構 * * @param list 資料集 * @param parentField 父級ID欄位 * @param idField id欄位 * @param childrenField 子集欄位 * @param <T> 資料型別 * @return 樹狀結構 * @throws IllegalAccessException 異常 */ public static <T> List<T> buildTree(List<T> list, Field parentField, Field idField, Field childrenField) throws IllegalAccessException { List<T> result = new ArrayList<>(); Iterator<T> iterator = list.iterator(); while (iterator.hasNext()) { T root = iterator.next(); iterator.remove(); childrenField.set(root, findChild(root, list, parentField, idField, childrenField)); // 重新整理 iterator iterator = list.iterator(); result.add(root); } return result; } /** * 查詢子集 * * @param root 節點 * @param list 所有集合 * @param parentField 父級欄位 * @param idField id欄位 * @param childrenField 子級欄位 * @param <T> * @return 子級集合 * @throws IllegalAccessException 異常資訊 */ private static <T> List<T> findChild(T root, List<T> list, Field parentField, Field idField, Field childrenField) throws IllegalAccessException { Object id = idField.get(root); List<T> children = new ArrayList<>(); Iterator<T> iterator = list.iterator(); while (iterator.hasNext()) { T node = iterator.next(); Object parentId = parentField.get(node); if (id.equals(parentId)) { iterator.remove(); childrenField.set(node, findChild(node, list, parentField, idField, childrenField)); // 重新整理 iterator iterator = list.iterator(); children.add(node); } } return children; } }

參考文章:https://blog.csdn.net/weixin_30284125/article/details/114225149