声明INode类

  1. import java.io.Serializable;
  2. import java.util.List;
  3. /**
  4. * 树形结构节点类
  5. *
  6. * @param <T>
  7. * @author xq
  8. */
  9. public interface INode<T> extends Serializable {
  10. /**
  11. * 获取当前ID
  12. *
  13. * @return id
  14. */
  15. Long getId();
  16. /**
  17. * 获取父节点id
  18. *
  19. * @return parent_id
  20. */
  21. Long getParentId();
  22. /**
  23. * 获取子类
  24. *
  25. * @return Children
  26. */
  27. List<T> getChildren();
  28. }

声明TreeUtil

  1. /**
  2. * @author xq
  3. */
  4. public class TreeUtil {
  5. public static TreeUtil build() {
  6. return new TreeUtil();
  7. }
  8. public <T extends INode> List<T> merge(List<T> items) {
  9. if (items == null || items.size() < 2) {
  10. return items;
  11. }
  12. List<T> list = new ArrayList<>();
  13. Map<Long, Integer> map = new HashMap<>(items.size());
  14. for (int i = 0; i < items.size(); i++) {
  15. // 获取当前所在array中的下标
  16. map.put(items.get(i).getId(), i);
  17. }
  18. Integer index;
  19. for (T item : items) {
  20. // 通过上级ID获取上级所在array中的位置
  21. index = map.get(item.getParentId());
  22. // 如果有那么加入子集
  23. if (index != null) {
  24. items.get(index)
  25. .getChildren()
  26. .add(item);
  27. } else {
  28. // 如果没有则加入集合
  29. list.add(item);
  30. }
  31. }
  32. return list;
  33. }
  34. }