¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * Redistributions in binary form must reproduce the above copyright |
| | | * notice, this list of conditions and the following disclaimer in the |
| | | * documentation and/or other materials provided with the distribution. |
| | | * Neither the name of the dreamlu.net developer nor the names of its |
| | | * contributors may be used to endorse or promote products derived from |
| | | * this software without specific prior written permission. |
| | | * Author: Chill åºéª (smallchill@163.com) |
| | | */ |
| | | package org.springblade.core.tool.node; |
| | | |
| | | import com.google.common.collect.ImmutableMap; |
| | | import com.google.common.collect.Maps; |
| | | import org.springblade.core.tool.utils.StringPool; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 森æç®¡çç±» |
| | | * |
| | | * @author smallchill |
| | | */ |
| | | public class ForestNodeManager<T extends INode<T>> { |
| | | |
| | | /** |
| | | * 森æçææèç¹ |
| | | */ |
| | | private final ImmutableMap<Long, T> nodeMap; |
| | | |
| | | /** |
| | | * 森æçç¶èç¹ID |
| | | */ |
| | | private final Map<Long, Object> parentIdMap = Maps.newHashMap(); |
| | | |
| | | public ForestNodeManager(List<T> nodes) { |
| | | nodeMap = Maps.uniqueIndex(nodes, INode::getId); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®èç¹IDè·åä¸ä¸ªèç¹ |
| | | * |
| | | * @param id èç¹ID |
| | | * @return 对åºçèç¹å¯¹è±¡ |
| | | */ |
| | | public INode<T> getTreeNodeAt(Long id) { |
| | | if (nodeMap.containsKey(id)) { |
| | | return nodeMap.get(id); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * å¢å ç¶èç¹ID |
| | | * |
| | | * @param parentId ç¶èç¹ID |
| | | */ |
| | | public void addParentId(Long parentId) { |
| | | parentIdMap.put(parentId, StringPool.EMPTY); |
| | | } |
| | | |
| | | /** |
| | | * è·åæ çæ ¹èç¹(ä¸ä¸ªæ£®æå¯¹åºå¤é¢æ ) |
| | | * |
| | | * @return æ çæ ¹èç¹éå |
| | | */ |
| | | public List<T> getRoot() { |
| | | List<T> roots = new ArrayList<>(); |
| | | nodeMap.forEach((key, node) -> { |
| | | if (node.getParentId() == 0 || parentIdMap.containsKey(node.getId())) { |
| | | roots.add(node); |
| | | } |
| | | }); |
| | | return roots; |
| | | } |
| | | |
| | | } |