java 通用树结构

有问题勿喷(手动狗头)

 

public class TreeNode<T> {

    String key;//节点key
    T value;//节点数据
    TreeNode<T>[] subNode;//当前节点子节点集
    private static final int LEN = 5;//默认子集长度

    public TreeNode(T value, String key) {
       new TreeNode<T>(value,key,LEN);
    }

    @SuppressWarnings("unchecked")
    public TreeNode(T value, String key, int maxSubNode) {
        this.value = value;
        this.key = key;
        this.subNode = (TreeNode<T>[]) Array.newInstance(this.getClass(), maxSubNode);
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public TreeNode<T>[] getSubNode() {
        return subNode;
    }

    public void setSubNode(TreeNode<T>[] subNode) {
        this.subNode = subNode;
    }

    @Override
    public String toString() {
        return "Node [key=" + key + ", value=" + value + ", subNode=" + Arrays.toString(subNode) + "]";
    }
}

public class TreeUtils<T> {
    public static <T> Result delNode(TreeNode<T> tree, String delkey) {
        Result result = new Result();
        if (EmptyUtil.isEmpty(tree) || EmptyUtil.isEmpty(delkey)) {
            return result.setFailMsg("空树或空key");
        }
        if(tree.getKey().equals(delkey)){
            return result.setReturnObject(null);
        }
        TreeNode<T>[] subNode = tree.getSubNode();
        if(EmptyUtil.isEmpty(subNode)){
            return result.setFailMsg("未找到符合的delkey");
        }
        subNode = delNodeByDelkey$Recursive(subNode,delkey);
        tree.setSubNode(subNode);
        result.setResultObject(tree);
        return result;
    }
    
    private static <T> TreeNode<T>[] delNodeByDelkey$Recursive(TreeNode<T>[] subTree,String delkey) {
        TreeNode<T> node ;
        for(int i =0,len = subTree.length; i < len; i++){
            node = (TreeNode<T>) subTree[i];
            if(EmptyUtil.isEmpty(node)){
                continue;
            }
            if(delkey.equals(node.getKey())){
                subTree[i] = null;
                continue;
            }
            TreeNode<T>[] tempSubs =  node.getSubNode();
            if(EmptyUtil.isNotEmpty(tempSubs)){
                tempSubs = delNodeByDelkey$Recursive(tempSubs,delkey);
            }
            node.setSubNode(tempSubs);
        }
        return subTree;
    }
    
    public static <T> Result addNode(String addKey,TreeNode<T> tree,TreeNode<T> node){
        Result reuslt = new Result();
        if(EmptyUtil.isEmpty(addKey) || EmptyUtil.isEmpty(tree) || EmptyUtil.isEmpty(node)){
           return reuslt.setFailMsg("空key或空树或空节点");
        }
        TreeNode<T>[] subTree = tree.getSubNode();
        subTree = addNodeToTreeByKey(addKey,tree.getKey(),node,subTree);
        tree.setSubNode(subTree);
        reuslt.setResultObject(tree);
        return reuslt;
    }
    
    private static <T> TreeNode<T>[] addNodeToTreeByKey(String addkey, String parentkey,TreeNode<T> node, TreeNode<T>[] subTree) {
        TreeNode<T> tempNode;
        for(int i = 0,len = subTree.length; i < len; i++){
            tempNode = subTree[i];
            if(!addkey.equals(parentkey)){
                if(EmptyUtil.isNotEmpty(tempNode)){
                    TreeNode<T>[] tempSubs = tempNode.getSubNode();
                    tempSubs = addNodeToTreeByKey(addkey,tempNode.getKey(),node,tempSubs);
                }
                continue;
            }
            if(EmptyUtil.isEmpty(tempNode)){
                subTree[i] = node;
            } 
        }
        return subTree;
    }
}

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        TreeNode<String> tree = new TreeNode<String>("root数据", "root", 1);
        
        TreeNode<String> first1 = new TreeNode<String>("first1", "first1", 1);
        TreeNode<String>[] aaa = (TreeNode<String>[]) Array.newInstance(TreeNode.class, 4);
        aaa[0] = first1;
        aaa[1] = first1;
        tree.setSubNode(aaa);
        System.err.println("----原树:" + tree);
        
        TreeNode<String> first2 = new TreeNode<String>("first2", "first2", 1);
        Result result = TreeUtils.addNode("first1",tree,first2);
        tree = (TreeNode<String>) result.getResultObject();
        System.err.println("加入节点:" + tree);
        
        Result result2 = TreeUtils.delNode(tree, "first2");
        tree = (TreeNode<String>) result2.getResultObject();
        System.err.println("删除节点:" + tree);
        
        
        Object obj = finfNumber(2);
        System.err.println(obj);
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
当然可以,以下是一个简单的 Java 通用树结构转换工具类: ```java import java.util.ArrayList; import java.util.List; public class TreeUtils { /** * 将通用树结构转换为指定类型的树结构 * * @param sourceList 原始树结构列表 * @param rootId 根节点 ID * @param builder 转换器 * @param <T> 目标树结构节点类型 * @return 目标树结构列表 */ public static <T extends TreeNode> List<T> convertTree(List<? extends TreeNode> sourceList, String rootId, TreeBuilder<T> builder) { List<T> targetList = new ArrayList<>(); for (TreeNode sourceNode : sourceList) { if (rootId.equals(sourceNode.getParentId())) { T targetNode = builder.build(sourceNode); targetNode.setChildren(getChildren(sourceNode.getId(), sourceList, builder)); targetList.add(targetNode); } } return targetList; } /** * 获取指定节点的子节点列表 * * @param parentId 父节点 ID * @param sourceList 原始树结构列表 * @param builder 转换器 * @param <T> 目标树结构节点类型 * @return 子节点列表 */ private static <T extends TreeNode> List<T> getChildren(String parentId, List<? extends TreeNode> sourceList, TreeBuilder<T> builder) { List<T> children = new ArrayList<>(); for (TreeNode sourceNode : sourceList) { if (parentId.equals(sourceNode.getParentId())) { T targetNode = builder.build(sourceNode); targetNode.setChildren(getChildren(sourceNode.getId(), sourceList, builder)); children.add(targetNode); } } return children; } /** * 树结构节点接口 */ public interface TreeNode { /** * 获取节点 ID * * @return 节点 ID */ String getId(); /** * 获取父节点 ID * * @return 父节点 ID */ String getParentId(); } /** * 树结构节点构建器接口 * * @param <T> 目标树结构节点类型 */ public interface TreeBuilder<T extends TreeNode> { /** * 构建目标树结构节点 * * @param sourceNode 原始树结构节点 * @return 目标树结构节点 */ T build(TreeNode sourceNode); } } ``` 使用方法示例: 假设有一个 `Node` 类,表示通用树结构节点,包含 `id`、`parentId`、`name` 等属性。现在需要将 `Node` 类型的通用树结构转换为 `Menu` 类型的树结构,其中 `Menu` 类型的节点包含 `id`、`parentId`、`name`、`url` 等属性。可以按以下步骤进行转换: 1. 定义 `Menu` 类型的节点: ```java public class Menu implements TreeUtils.TreeNode { private String id; private String parentId; private String name; private String url; private List<Menu> children; // 省略 getter 和 setter 方法 } ``` 2. 定义 `Menu` 类型的节点构建器: ```java public class MenuBuilder implements TreeUtils.TreeBuilder<Menu> { @Override public Menu build(TreeUtils.TreeNode sourceNode) { Node node = (Node) sourceNode; Menu menu = new Menu(); menu.setId(node.getId()); menu.setParentId(node.getParentId()); menu.setName(node.getName()); menu.setUrl(node.getUrl()); return menu; } } ``` 3. 调用 `TreeUtils.convertTree()` 方法进行转换: ```java List<Node> nodeList = ... // 原始树结构列表 List<Menu> menuList = TreeUtils.convertTree(nodeList, "root", new MenuBuilder()); ``` 其中,`nodeList` 是原始树结构列表,`"root"` 是根节点 ID,`new MenuBuilder()` 是 `Menu` 类型的节点构建器。 希望这个工具类能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值