树结构转换

数据结构与算法:链表的树结构优化转换 本文旨在为开发者和计算机科学学生提供一套完整的链表到树结构转换的方法论。如何高效地将线性链表转换为树形结构不同转换算法的性能比较实际应用中的最佳实践和优化技巧文章首先介绍链表和树结构的基本概念,然后深入探讨转换算法的核心原理,接着通过实际代码示例展示实现细节,最后讨论应用场景和未来发展方向。链表(Linked List):线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针二叉树(Binary Tree):每个节点最多有两个子节点的树结构平衡因子(Balance Factor) 阅读详情

树结构转换工具

Data树化

行政区划树化

 /**
 使用方式:
 queryAreaTree(null,true);
 */

public Area queryAreaTree(Area parentingAreaNode, boolean firstInitness) throws ServiceException {
    //定义最外层数据
    if (Objects.isNull(parentingAreaNode) && firstInitness) {
        Area root = new Area();
        root.setName("全国");
        root.setIsParent(true);
        root.setIsLeaf(false);
        root.setValue(PlatformConstants.AREA_ROOT_ID);
        root.setId(PlatformConstants.AREA_ROOT_ID);
        root.setIsRoot(true);
        root.setLevel(0);
        root.setPath(PlatformConstants.AREA_ROOT_ID);
        parentingAreaNode = root;
    }

    //叶子地区 不给这个属性
    if (parentingAreaNode.isLeaf()) {
        parentingAreaNode.setSubAreas(null);
        return parentingAreaNode;
    }

    Area parent = parentingAreaNode;
    Assert.state(StringUtils.isNotBlank(parentingAreaNode.getId()), "父地区节点不能为空");
    //根据id获取字节点数据list
    List<Area> subAres = querySubAreasByPid(parentingAreaNode.getId())
        .stream().map(e -> {
        e.setLevel(parent.getLevel() + 1);
        e.setPath(parent.getPath() + "/" + e.getId());
        e.setIsRoot(false);
        return e;
    }).collect(Collectors.toList());
    parentingAreaNode.setSubAreas(subAres);
    //递归组装子节点的数据
    subAres.stream().parallel().forEach((AdjustConsumer<Area>) e -> queryAreaTree(e, false));
    return parentingAreaNode;
}

public List<Area> querySubAreasByPid(String pid) throws ServiceException {
    Assert.state(StringUtils.isNotBlank(pid), "查询子地区树 pid不能为空");
    List<Area> response = requestGetAndResponse("获取到该id的所有子节点方法");
    return response;
}
树对象
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import net.minidev.json.annotate.JsonIgnore;

import java.io.Serializable;
import java.util.List;

@Data
@Accessors(chain = true)
@ApiModel("地区")
public class Area implements Serializable {
    private static final long serialVersionUID = 8195138678138842439L;
    @ApiModelProperty(value = "地区id", example = "1007", position = -20)
    private String id;
    @ApiModelProperty(value = "地区编码", example = "1007", position = -20)
    private String value;
    @ApiModelProperty(value = "地区", example = "浙江省", position = -20)
    private String name;
    @ApiModelProperty(value = "地区上级节点id", example = "1", position = -20)
    private String parentId;
    @ApiModelProperty(value = "地区层级", example = "1", position = -20)
    private Integer level;
    @ApiModelProperty(value = "地区节点路径", example = "1/1007", position = -20)
    private String path;
    @ApiModelProperty(value = "地区是否为叶子节点", example = "false", position = -20)
    private Boolean isLeaf;
    @ApiModelProperty(value = "地区是否为父节点", example = "true", position = -20)
    private Boolean isParent;
    @JsonIgnore
    private Boolean isRoot;
    @ApiModelProperty(value = "下一级地区节点", example = "", position = -20)
    private List<Area> subAreas;

    public boolean isLeaf(){
        return this.isLeaf;
    }
}

树形结构数据一般都是以子父id的形式存在数据库中,查询的时候只是带有子id和parent_id的List集合

并不是树形结构,所以我们现在要将普通的List集合转换为树结构数据(本工具类扩展操作树结构数据方法)

import com.alibaba.druid.util.StringUtils;
import com.ywb.pms.vo.BaseTreeNode;
import org.apache.commons.collections.CollectionUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @Author: zyl
 * @Date: 2019/8/19 14:32
 * @Version 1.0
 */
public class TreeNodeUtil {
    /**
     * 获取所有关联父节点数据集合列表
     * 由对应的子节点到根节点(root)
     *
     * @param id        要搜索对应父节点节点的id
     * @param listNodes 要处理列表集合节点数据(不是组合成树状图后的数据)
     */
    public static <T extends BaseTreeNode> List<T> getParentList(List<T> listNodes, String id) {
        if (StringUtils.isEmpty(id) || CollectionUtils.isEmpty(listNodes)) {
            return null;
        }
        // 数据保存的对象
        List<T> treeNodes = new ArrayList<>();
        int length = listNodes.size();
        // 防止死循环问题
        byte[] nodeIndex = new byte[length];
        T t;
        for (int i = 0; i < length; i++) {
            t = listNodes.get(i);
            // 循环找到节点id,赋值id等于该节点pid
            if (id.equals(t.getId()) && nodeIndex[i] == 0) {
                nodeIndex[i] = 1;
                treeNodes.add(t);//第一次找到本身放进集合,然后找父节点
                id = t.getpId();
                // 父主键为空,null,"0",结束循环
                if (StringUtils.isEmpty(id) || "null".equals(id) || "0".equals(id)) {
                    break;
                }
                i = -1;
            }
        }
        return treeNodes;
    }

    /**
     * 获取关联子节点数据集合列表
     * 由对应的子节点向子节点搜索
     *
     * @param listNodes 要处理列表集合节点数据(不是组合成树状图后的数据)
     * @param ids       要搜索对应子节点的id集合
     */
    public static <T extends BaseTreeNode> List<T> getChildList(List<T> listNodes, List<String> ids) {
        return CollectionUtils.isEmpty(ids) ? null : getChildList(listNodes, ids.toArray(new String[ids.size()]));
    }

    /**
     *
     * @param listNodes 要处理列表集合节点数据(不是组合成树状图后的数据)
     * @param id 要搜索对应子节点的id
     * @param <T>
     * @return
     */
    public static <T extends BaseTreeNode> List<T> getChildList(List<T> listNodes, String id) {
        return StringUtils.isEmpty(id) ? null : getChildList(listNodes, new String[]{id});
    }

    /**
     *
     * @param listNodes 要处理列表集合节点数据(不是组合成树状图后的数据)
     * @param ids 要搜索对应子节点的id(数组)
     * @param <T>
     * @return
     */
    public static <T extends BaseTreeNode> List<T> getChildList(List<T> listNodes, String[] ids) {
        if (ids == null || ids.length == 0 || CollectionUtils.isEmpty(listNodes)) {
            return null;
        }
        // 数据保存的对象
        List<T> treeNodes = new ArrayList<>();
        int length = listNodes.size();
        // 防止死循环问题
        byte[] nodeIndex = new byte[length];
        // 循环获取要获取节点
        T t;
        for (String id : ids) {
            for (int i = 0; i < length; i++) {
                t = listNodes.get(i);
                if (id.equals(t.getId())) {
                    treeNodes.add(t);
                    nodeIndex[i] = 1;
                }
            }
        }
        String tempId;
        int index = 0;
        while (index < treeNodes.size()) {
            tempId = treeNodes.get(index).getId();
            if (!StringUtils.isEmpty(tempId)) {
                for (int i = 0; i < length; i++) {
                    t = listNodes.get(i);
                    if (tempId.equals(t.getpId()) && nodeIndex[i] == 0) {
                        nodeIndex[i] = 1;
                        treeNodes.add(t);
                    }
                }
            }
            index++;
        }
        return treeNodes;
    }

    /**
     * 封装整个树状图数据
     *
     * @param listNodes 要处理列表集合节点数据
     */
    public static <T extends BaseTreeNode> List<T> assembleTree(List<T> listNodes) {
        List<T> newTreeNodes = new ArrayList<>();
        // 赋值最上面节点的值
        newTreeNodes.addAll(listNodes.stream()
                .filter(t -> StringUtils.isEmpty(t.getpId()) || "null".equals(t.getpId()) || "0".equals(t.getpId()))
                .collect(Collectors.toList()));
        // 循环处理子节点数据
        for (T t : newTreeNodes) {
            //递归
            assembleTree(t, listNodes);
        }
        return newTreeNodes;
    }

    /**
     * 封装层单个树子节点数据
     *
     * @param id        根目录节点id
     * @param listNodes 要处理的列表数据
     */
    public static <T extends BaseTreeNode> T assembleTreeById(String id, List<T> listNodes) {
        if (StringUtils.isEmpty(id) || CollectionUtils.isEmpty(listNodes)) {
            return null;
        }
        // 获取对应的节点
        T node = null;
        for (T temp : listNodes) {
            if (id.equals(temp.getId())) {
                node = temp;
                break;
            }
        }
        assembleTree(node, listNodes);
        return node;
    }

    /**
     * 根据节点封装树状图集合数据
     *
     * @param node      处理的节点(当前节点)
     * @param listNodes 要处理的列表数据
     */
    static <T extends BaseTreeNode> void assembleTree(T node, List<T> listNodes) {
        if (node != null && !CollectionUtils.isEmpty(listNodes)) {
            // 循环节点数据,如果是子节点则添加起来
            listNodes.stream().filter(t -> Objects.equals(t.getpId(), node.getId())).forEachOrdered(node::addChild);
            // 循环处理子节点数据,递归
            if (!CollectionUtils.isEmpty(node.getChild())) {
                for (Object t : node.getChild()) {
                    //递归
                    assembleTree((T) t, listNodes);
                }
            }
        }
    }

    /**
     * 主键输出
     *
     * @param treeNodes 节点
     * @return String 注解集合
     */
    public static <T extends BaseTreeNode> String idToString(List<T> treeNodes) {
        return idToString(treeNodes, ",");
    }

    /**
     * 主键输出
     *
     * @param treeNodes 节点
     * @param c       拼接字符串
     * @return String 注解集合
     */
    public static <T extends BaseTreeNode> String idToString(List<T> treeNodes, String c) {
        StringBuilder pks = new StringBuilder();
        if (treeNodes != null) {
            for (T t : treeNodes) {
                pks.append(t.getId()).append(c);
            }
        }
        return pks.length() > 0 ? pks.delete(pks.length() - c.length(), pks.length()).toString() : "";
    }
}

2树化方法

 public Object getTree() {
        // 查询数据
        List<LxhpArea> areaList = areaService.list();
        // 构建的整个树数据
        List<TreeNode<String>> treeNodeList = areaList.stream().map(area -> {
            // 扩展字段赋值,下面要取这里的值
            Map<String, Object> extraMap = new HashMap<>();
            extraMap.put("domain", area.getDomain());
            extraMap.put("isOpen", area.getIsOpen());
            extraMap.put("bigArea", area.getBigArea());
            // 单个树数据构建
            TreeNode<String> treeNode = new TreeNode<String>()
                    .setId(String.valueOf(area.getId())) // 主键
                    .setParentId(String.valueOf(area.getReid())) // 父节点ID
                    .setName(area.getName()) // 省份名称
                    .setWeight(area.getSortOrder()) //权重,排序
                    .setExtra(extraMap); // 扩展字段
            return treeNode;
        }).collect(Collectors.toList());
 
        // 配置
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        // 自定义属性名(修改默认名称)
        treeNodeConfig.setWeightKey("sortOrder");
        treeNodeConfig.setChildrenKey("childrenNode");
        // 最大递归深度
        treeNodeConfig.setDeep(1);
 
        //转换器
        List<Tree<String>> treeNodes = TreeUtil.build(treeNodeList, "1", treeNodeConfig,
                (treeNode, tree) -> {
                    // 给树节点赋值(还能set 父 或子节点树)
                    tree.setId(treeNode.getId());
                    tree.setParentId(treeNode.getParentId());
                    tree.setWeight(treeNode.getWeight());
                    tree.setName(treeNode.getName());
                    // 扩展属性值赋值
                    // treeNode.getExtra().getOrDefault("domain", null) 是获取上面Map放进去的值,没有就是 null
                    tree.putExtra("domain", treeNode.getExtra().getOrDefault("domain", null));
                    tree.putExtra("isOpen", treeNode.getExtra().getOrDefault("isOpen", null));
                    tree.putExtra("bigArea", treeNode.getExtra().getOrDefault("bigArea", null));
                });
        return JSONUtil.parse(treeNodes);
    }

树转List

解析树

@Data
@Accessors(chain = true)
static class AreaTreeHolder {
    Area areaLinkedNode;//树化后的数据
    Map<String, Area> treeNavigate;//所有树导航结构

    public static AreaTreeHolder getInstant(Area area) {
        return new AreaTreeHolder()
            .setAreaLinkedNode(area)
            .setTreeNavigate(initNavigate(Lists.newArrayList(area), Maps.newConcurrentMap()));
    }

    public static Map<String, Area> initNavigate(List<Area> areas, Map<String, Area> treeNavigate) {
        areas.forEach(e -> {
            treeNavigate.put(e.getId(), e);
            if (CollectionUtils.isNotEmpty(e.getSubAreas())) {
                initNavigate(e.getSubAreas(), treeNavigate);
            }
        });
        return treeNavigate;
    }
}

Java实体类

/**
实体需要继承的java类
 * @author : Latent
 * @createdDate : 2019/8/12
 * @updatedDate
 */
public  class BaseTreeNode {
    /**
     * 子Id
     */
    private String id;
    /**
     * 父ID
     */
    private String pId;

    private List<BaseTreeNode> child;

    public BaseTreeNode() {
    }

    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getpId() {
        return this.pId;
    }

    public void setpId(String pId) {
        this.pId = pId;
    }

    public List<BaseTreeNode> getChild() {
        return this.child;
    }

    public void setChild(List<BaseTreeNode> child) {
        this.child = child;
    }

    public void addChild(BaseTreeNode baseTreeNode) {
        if (this.child == null) {
            this.setChild(new ArrayList());
        }

        this.getChild().add(baseTreeNode);
    }
}


/**
 * @author : Latent
 * @createdDate : 2019/8/15
 * @updatedDate
 */
@Data
public class AddressDto extends BaseTreeNode {
    /**
     * 地址名称
     */
    String addressName;
    /**
     * 地址编码
     */
    String addressCode;
    /**
     * 类型
     */
    String addressType;
}

Service类

@Override
    public List<AddressDto> getlistAddress() {
        List<AddressDto> list = dao.listAddress("");
        //将集合转换成树状结构
        List<AddressDto>  listDto = TreeNodeUtil.assembleTree(list);
        return listDto;
    }

数据库

DROP TABLE IF EXISTS `address_info`;
CREATE TABLE `address_info`  (
  `address_pk` char(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '插入时间',
  `delete_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否删除',
  `address_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址编码',
  `address_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址名',
  `address_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址类型',
  `p_address_pk` char(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上级主键',
  `baidu_city_code` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '百度地图编码',
  `is_audit_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否通过审核',
  `update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '最新修改时间',
  `area_code` char(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '区',
  `sort_num` int(11) NULL DEFAULT NULL COMMENT '排序',
  `audit_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`address_pk`) USING BTREE,
  INDEX `FK20mbxgi8i8n1egyg4mee8y2ow`(`p_address_pk`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of upms_address
-- ----------------------------
INSERT INTO `address_info` VALUES ('002a3308-273e-4a8b-bdd2-f51271922211', '2017-07-21 23:09:23', 'Y', 'YT', '烟台市', 'CITY', '35a564c8-75a5-4e3f-a5a3-9707355ffbb6', '326', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('00513404-d9bd-41d9-a679-f07f86cf8252', '2017-07-25 18:21:22', 'Y', 'LN', '辽宁省', 'PROVINCE', NULL, NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('00932ca7-7f7c-43c6-9a2a-a69ef9c9096d', '2017-07-25 17:14:45', 'Y', 'SC', '四川省', 'PROVINCE', NULL, NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('00c1f147-8d86-4211-a3c8-d6b023b17388', '2016-06-27 17:40:57', 'Y', 'SQ', '肇庆', 'CITY', '668811cd-2158-421c-9270-4b6219aa4804', NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('00e44393-c92d-45fb-9923-76704aca8cc6', '2017-07-25 16:58:51', 'Y', 'HK', '海口市', 'CITY', '9e605f4d-1dec-4105-b3c8-a7dad023cabe', '125', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('00f30856-594f-404d-af36-d0d727f2d120', '2017-07-25 17:08:16', 'Y', 'ZSQD', '中沙群岛', 'CITY', '9e605f4d-1dec-4105-b3c8-a7dad023cabe', '1498', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('011c99be-b57f-4134-8263-f92a6bde33e8', '2017-07-24 23:05:32', 'Y', 'HS', '黄石市', 'CITY', '0678bf05-47e1-4b21-bd5b-ab2ee0d4e32c', '311', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0292fd00-b24d-4eae-b22e-53f6366c6a55', '2017-07-25 17:11:42', 'Y', 'LG', '临高县', 'CITY', '9e605f4d-1dec-4105-b3c8-a7dad023cabe', '2033', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0323c938-b222-443b-bb23-cba047d8bd26', '2017-07-21 22:33:37', 'Y', 'LD', '娄底市', 'CITY', 'a7842f5d-be1a-4113-bdc6-613609a2bf17', '221', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('032caf42-28a8-4161-8665-7d60da75ff3f', '2017-07-24 23:12:43', 'Y', 'YC', '宜春市', 'CITY', 'c0546c2d-ae74-4dd0-acaf-f2d7e444b4ff', '278', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('03787b88-1186-4f8f-ba53-a6b75439a49c', '2017-07-24 23:04:25', 'Y', 'YC', '宜昌市', 'CITY', '0678bf05-47e1-4b21-bd5b-ab2ee0d4e32c', '270', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('044e41bc-6db3-4565-977f-d8f6bea0ee64', '2017-07-24 23:24:29', 'Y', 'AL', '阿里地区', 'CITY', '16bc37b6-cca1-477a-9708-bf791bfdb90d', '103', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('059f7386-ee96-407d-9e50-efecb339f846', '2017-07-25 18:05:00', 'Y', 'YL', '玉林市', 'CITY', '22a54667-fa5c-4342-a3a2-2a0cf866e441', '361', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('05e098e9-0b78-4cb6-9841-605e8df374cb', '2018-04-26 15:56:54', 'N', 'ES', '恩施', 'CITY', '6684e528-c123-4980-a784-90a35ce8ab55', '373', 'N', '2018-04-26 15:56:53', '422800', 88, 'Y');
INSERT INTO `address_info` VALUES ('062cfb72-e51c-44ea-8649-ffdcf3ba939e', '2017-07-24 22:07:33', 'Y', 'CD', '承德市', 'CITY', 'a7e13d9e-8e7a-45ab-9828-27e772882774', '207', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0678bf05-47e1-4b21-bd5b-ab2ee0d4e32c', '2017-07-24 23:01:32', 'Y', 'HB', '湖北省', 'PROVINCE', NULL, NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0689c9f7-3e2a-4c96-b3b2-a41b2dd15864', '2016-06-01 11:13:51', 'Y', 'zz', '郑州', 'CITY', '1ec283ec-22cc-422f-ac9a-4cf4e018edab', NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('06be4ab2-1432-47ca-a501-5064d063b3b7', '2017-07-24 21:47:14', 'Y', 'SX', '山西省', 'PROVINCE', NULL, NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('06c1bc9d-6a8d-4d4f-a528-0244c1322e7e', '2017-07-24 22:14:03', 'Y', 'SQ', '宿迁市', 'CITY', '40ca140c-7539-4c55-bd64-f2711ee2d1db', '277', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('070982ba-9c07-42dc-afb4-d747a8f53bd4', '2017-07-21 22:32:17', 'Y', 'HY', '衡阳市', 'CITY', 'a7842f5d-be1a-4113-bdc6-613609a2bf17', '159', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0756ae21-3e71-4b4e-a979-a1a7746b38c9', '2017-07-25 17:59:34', 'Y', 'GL', '桂林市', 'CITY', '22a54667-fa5c-4342-a3a2-2a0cf866e441', '142', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('07a6a88c-31eb-456e-8588-103b3ed2ee79', '2017-07-24 23:35:19', 'Y', 'ALE', '阿拉尔市', 'CITY', '69f0ce1a-f967-4c9d-a9f6-6e451dfa3956', '731', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0837fa39-df89-4a33-83f9-ed10bf430ed0', '2017-07-21 23:13:45', 'Y', 'BY', '白银市', 'CITY', 'b33004bd-34c7-4023-a6b4-4862aa006b01', '35', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('08442620-a076-4a4c-8f81-50200372709d', '2017-07-25 18:35:03', 'Y', 'QN', '黔南布依族苗族自治州', 'CITY', '1759947f-809f-40f0-901e-1ad041991098', '306', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('087c79ab-c63f-4970-8631-38e33e158d21', '2017-07-24 22:20:44', 'Y', 'HF', '合肥市', 'CITY', '1945ba57-474f-4b3b-aaf9-0e95c116eb13', '127', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('08d811a4-f1f3-4cf4-90dc-528ccb89010e', '2017-07-24 23:06:46', 'Y', 'ESTJZ', '恩施土家族苗族自治州', 'CITY', '0678bf05-47e1-4b21-bd5b-ab2ee0d4e32c', '373', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('08dfb45b-41fc-4719-b726-57110bd97832', '2016-03-30 10:14:44', 'Y', 'BJ', '北京', 'PROVINCE', NULL, NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('09077956-0a60-4f89-a1b3-109d8038b18f', '2017-07-24 22:55:24', 'Y', 'CZ', '潮州', 'CITY', '668811cd-2158-421c-9270-4b6219aa4804', '201', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('097effa5-74ad-4016-ba88-2f0720617d8d', '2017-07-25 17:06:54', 'Y', 'BT', '保亭黎族苗族自治县', 'CITY', '9e605f4d-1dec-4105-b3c8-a7dad023cabe', '1217', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('09aeb664-ef91-44c2-9c77-0d181b25dc89', '2017-07-24 22:31:59', 'Y', 'SX', '绍兴市', 'CITY', '6ee8d443-99a4-4d9f-b184-71aad2f2fa70', '293', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('09f425ad-0304-429c-98c4-8227719c19a6', '2016-06-27 17:27:42', 'Y', 'GS', '甘肃省', 'PROVINCE', NULL, NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0b51a07d-0363-4b37-9429-a496bdf22581', '2017-07-21 22:51:36', 'Y', 'PDS', '平顶山市', 'CITY', '521636ef-6cec-4763-962d-ebb3ef301430', '213', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0b739b4f-3e3e-472e-a0b4-d9e24fe5212a', '2017-07-13 21:36:50', 'Y', 'YN、', '云南省', 'PROVINCE', NULL, NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0b9d8ef5-aa1e-4186-9ea4-df1d10877a86', '2017-07-21 22:44:38', 'Y', 'XX', '新乡市', 'CITY', '521636ef-6cec-4763-962d-ebb3ef301430', '152', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0bf9a75f-7cfe-4509-a17f-12dd5bb757ca', '2017-07-24 21:34:34', 'Y', 'YSZZ', '玉树藏族自治州', 'CITY', 'a87e8d52-be87-4ca2-9585-87ba0004cedd', '71', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0cea279a-1624-4d4e-a8ee-9b8d70b54766', '2017-07-25 18:32:44', 'Y', 'TR', '铜仁地区', 'CITY', '1759947f-809f-40f0-901e-1ad041991098', '205', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0d1a7cc9-052a-420c-8078-48bc2ca839f3', '2017-07-19 23:14:11', 'Y', 'CD', '成都', 'PROVINCE', NULL, '75', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0d219938-584e-4326-8224-cf79ed5fdd07', '2017-07-24 22:34:06', 'Y', 'DG', '东莞', 'CITY', '668811cd-2158-421c-9270-4b6219aa4804', '119', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0db76d4e-dafc-44fe-8991-2657f4a1e7fc', '2016-06-27 17:42:04', 'Y', 'HY', '河源', 'CITY', '668811cd-2158-421c-9270-4b6219aa4804', NULL, NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0dd4a2df-ef7a-446b-b098-440c91ac698d', '2017-07-25 18:48:52', 'Y', 'PD', '屏东县', 'CITY', 'a1274f9f-193e-40f9-a569-acf719f69c47', '9012', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0e2c0813-39b9-4437-aea2-20622e36e79f', '2017-07-24 23:32:08', 'Y', 'YLHSK', '伊犁哈萨克自治州', 'CITY', '69f0ce1a-f967-4c9d-a9f6-6e451dfa3956', '90', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0ec5e764-f0b3-49a5-8b06-cf4c9f60d69c', '2017-07-24 22:54:08', 'Y', 'ZJ', '湛江', 'CITY', '668811cd-2158-421c-9270-4b6219aa4804', '198', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('0ff962eb-ad51-403f-a514-84f38e3f53e2', '2017-07-24 22:15:05', 'Y', 'WX', '无锡市', 'CITY', '40ca140c-7539-4c55-bd64-f2711ee2d1db', '317', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('10580daa-6143-40d4-aa2f-6a7aed4503f7', '2017-07-15 19:29:08', 'Y', 'SH', '上海', 'PROVINCE', NULL, '289', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('10d948cc-be28-4bc6-affc-bf0b37dbfd69', '2017-07-25 17:53:26', 'Y', 'XSBN', '西双版纳傣族自治州', 'CITY', '6b197334-dcdd-4350-9b49-6a2ca4dc1c8d', '109', NULL, '2018-03-29 03:55:25', NULL, NULL, 'Y');
INSERT INTO `address_info` VALUES ('110101', '2018-06-27 09:11:10', 'N', NULL, '东城区', 'AREA', '2b5facc8-fe2b-46dd-9e06-f491390f8ec1', NULL, NULL, '2018-06-27 09:11:10', '110101', NULL, 'N');
INSERT INTO `address_info` VALUES ('110102', '2018-06-27 09:11:10', 'N', NULL, '西城区', 'AREA', '2b5facc8-fe2b-46dd-9e06-f491390f8ec1', NULL, NULL, '2018-06-27 09:11:10', '110102', NULL, 'N');
INSERT INTO `address_info` VALUES ('110105', '2018-06-27 09:11:10', 'N', NULL, '朝阳区', 'AREA', '2b5facc8-fe2b-46dd-9e06-f491390f8ec1', NULL, NULL, '2018-06-27 09:11:10', '110105', NULL, 'N');
Mamba与iTransformer融合:时间序列预测中的曼巴注意力机制创新实践 本文探讨了Mamba与iTransformer融合在时间序列预测中的创新实践,重点介绍了曼巴注意力机制的设计与优势。通过双路径信息流设计,该方案在保持O(n)复杂度的同时,显著提升了预测精度和训练效率。实验证明,混合架构在电力负荷、气象数据等多变量长序列场景中表现优异,预测误差降低至0.083,内存占用仅4.2GB。 阅读详情

相关推荐

OpenClaw + Qwen 模型集成飞书完整教程

1、环境要求:- **操作系统**: Windows- **Node.js**: v18+ (推荐 v20+)- **飞书账号**: 需要企业管理员权限(创建应用用)或者个人飞书账号创建个人应用- **网络**: 能访问 GitHub 和飞书开放平台2、安装Node.js下载完成后验证是否安装成功,cmd窗口输入“node --version”,显示版本号即为安装成功(如下图所示)3、获取大模型APIKEY(这里以Qwen为例)

qq_29609427的博客 475

【数据结构-树】树、二叉树、森林的转换

树、二叉树、森林的转换

Mount256的博客 279

vc mfc listctrl使用虚拟列表 虚拟列表用法

note 虚拟列表可有效加载大量数据 需要处理listctrl的 LVN_GETDISPINFO 消息 使用虚拟列表 不能 使用 insert的方法插入数据,而是告诉listctrl 当前要显示多少行 使用SetItemCount函数告诉listctrl当前显示多少行 使用虚拟列表需要自己维护数据源 使用 添加list ctrl 控件 将其Owner Data 属性 设置为 True 添加...

知其所以然 397

非常好用的在线画树网站(树结构的自动生成工具,免去手动画树的烦恼)

最近编译原理学到语法分析树,需要频繁、大量地画树结构,一开始我使用了画图、PPT等工具,或是在纸上画好然后拍下来,但很是麻烦。 经同学推荐,找到了这样一个树的自动生成工具:Syntax Tree Generator。它的使用页面是这样的: 非常简单和高效。每个中括号代表一棵子树。在此记录。 网址为:http://mshang.ca/syntree/ ...

乔卿的博客 3万+

ArcGIS学习记录—SHP文件转换为KML KMZ数据,并显示面要素相应的标注

使用相应软件操作获取KMZ数据得以下发到外业调查人员,使得矢量数据能够更显而易见,可视化,让外业人员的工作减轻许多。(过程步骤是借鉴于网络上的相关人士给的建议,根据这些建议自己做出来的步骤,可能有些粗略,有问题的话可以再进行探讨)...

qq_41046162的博客 5万+

Geant4 学习笔记(一):实现multi-thread多线程

简单修改实现Geant4多线程

weixin_52417815的博客 6083

Node下组装树形结构的数据

Node下组装树形结构的数据 直接上代码 /** * @author JUE * @comments 合并树形数据(合并后的数据放在childList中) * @time * @modification * @param data 需要转换为树形的数据 * @param formatData 树形结构 [[一级字段...],[二级字段...]...] 根据每级字段首字段合并数据首字段...

JYJEY的博客 761

支付宝个人年度账单爬虫实战:从扫码登录到数据解析的全链路解析

作为一名数据爱好者或量化分析师,获取自己的支付宝年度账单不仅是对个人消费行为的深度复盘,更是实现"数据自主权"的第一步。print(f"{row['year']}年: 收入{row['total_income']:.2f} | 支出{row['total_expense']:.2f} | 结余{row['net_savings']:.2f}"){"category": "餐饮", "amount": 12000, "count": 345},"""打开登录页,等待用户扫码,返回Cookie字典"""

2201_76125261的博客 328

POJ 3321 Apple Tree 【树形结构转变为线性结构+线段树OR树状数组】

Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21587   Accepted: 6551 POJ 3321 链接: Description There is an apple tree outside of kaka's house.

Fighting! 3484

Flowise智能调度系统设计与实现

本文深入探讨Flowise平台的智能调度系统设计与实现,包括调度模型、调度策略、调度优化、调度应用等方面。通过详细的设计方案和实现策略,帮助开发者构建智能的调度系统。本文详细介绍了Flowise平台的智能调度系统设计与实现,包括调度模型、调度策略、调度优化、调度应用等方面。通过详细的设计方案和实现策略,帮助开发者构建智能的调度系统。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1016

Python-自动化绘制股票价格通道线

创建更强大、更可靠的价格通道检测算法。

探索人工智能领域 947

antd-vue中树结构显示 在线数/总数,实现在线人员绿色高亮,排序在前。(超难)

antd-vue中树结构显示 在线数/总数,实现在线人员绿色高亮,排序在前。 最近开发中,遇到了一个需求,需要使用到antd-vue下的Tree组件。需要实现的功能点如下: 1.树结构是部门的组织机构,包含的有部门内容和人员。 2.每个树节点标题需要显示(在线人数/总数)的格式。 3.对于在线人员,需要图标点亮,并且排序在最上方展示。对于离线人员,需要图标暗掉。

Yan9_9的博客 1878

YOLO26涨点改进 | 全网独家首发 主干改进篇 | TGRS 2025 | RepViT-TD,告别庞大骨干!YOLO26 + RepViT-TD轻量又强大,实现更快更准的小目标检测!

本文提出将RepViT-TD轻量级主干网络应用于YOLO26目标检测框架,以提升小目标检测性能。RepViT-TD通过优化计算资源分配,强化前两层高分辨率特征提取能力,在保持轻量化的同时(仅4.85M参数)显著提升微小目标的检测精度(AI-TODv2数据集AP50达54.6%)。文章详细介绍了三种主干改进方案(RepVit_ldy1/2/3)的代码实现,并提供了完整的YAML配置文件修改指南,使模型能高效部署于边缘设备。实验表明,该方法在计算复杂度(38.19G FLOPs)和检测精度间取得了良好平衡。

Ai缝合怪、助力小伙伴高效发论文 326

list转换成为树结构

DTO--有个childs的list字段,泛型为自己 package com.uindata.dto.ss; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.cons...

疙瘩陈 2680

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JAVA 转换 树结构数据

JAVA 转换 树结构数据 第一步:引入fastjson <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> ...

HappyLoves 1055

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

树结构使用实例---实现数组和树结构的转换

树是一种非散列数据结构,和非散列表一样,它对于存储需要快速查找的数据非常有用。 树是一种分层数据的抽象模型。现实生活中最常见的树的例子是家谱,或是公司的组织架构 本文将讲述一个实例,构造一棵树来实现数组和tree的相互转换,这在前端树结构中是经常遇到的。 需求场景: 将数组转化树结构,并将树结构转化为数组 数组 const list= [ { id: 1001, parentId: 0, name: 'AA' }, { id: 1002, parentId: 1001, ...

前端361 3729

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JavaScript 数组结构与树结构的转换

@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; overflow-x: hidden; color: rgba(43, 43, 43, 1); font-family: -apple-system, system-ui, BlinkMacSystemFont, Hel...

程序员小明1024 1074

JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换

JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换 经常有同学问树结构的相关操作,在这里总结一下JS树形结构一些操作的实现思路,并给出了简洁易懂的代码实现。 本文内容结构大概如下: 遍历树结构 1. 树结构介绍 JS中树结构一般是类似于这样的结构: let tree = [ { id: '1', title: '节点1', children: [ { id: '1-1', title: '节点1-1' },

weixin_42069147的博客 5564

js数组和树结构数据相互转换

数组转树结构采取递归和非递归两种方式,树结构转扁平化数组采取深度优先遍历(递归和非递归两种方式)和广度优先遍历实现。 let arr =[ {id:2,name:'部门B',parentId:0}, {id:3,name:'部门C',parentId:1}, {id:1,name:'部门A',parentId:2}, {id:4,name:'部门D',parentI...

susuzhe 1万+

Java复制树结构数据方法_JAVA 转换 树结构数据

JAVA 转换 树结构数据第一步:引入fastjsoncom.alibabafastjson${fastjson.version}第二步:用到了工具内的JSONPath/*** 树转换** @param obj 需要转换的对象* @param parentCodeFieldName 父标识字段名* @param parentCode 父标识值* @param currentCodeFieldNam...

weixin_39625008的博客 1358

js 数组与树结构相互转换

【代码】js 数组与树结构相互转换。

qq_50109437的博客 336

JS实现数组与树结构的相互转换

1.数组转换为数结构 let data= [ { id: 2, name: '部门B', parentId: 0 }, { id: 3, name: '部门C', parentId: 1 }, { id: 1, name: '部门A', parentId: 2 }, { id: 4, name: '部门D', parentId: 1 }, { id: 5, name: '部门E', p

少吃点肉的博客 1750

JavaScript扁平数组和树结构互相转换

【代码】JavaScript扁平数组和树结构互相转换。

Dwyane、的博客 255

js把平铺的树结构转换成树结构

平铺的树结构转换成树结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> &lt

hulover的博客 742

es6遍历树结构并判断_JavaScript树结构操作:查找、遍历、筛选、树结构和列表结构相互转换...

经常有同学问树结构的相关操作,也写了很多次,在这里总结一下JS树形结构一些操作的实现思路,并给出了简洁易懂的代码实现。本文内容结构大概如下:一、遍历树结构1. 树结构介绍JS中树结构一般是类似于这样的结构:let tree = [ { id: '1', title: '节点1', children: [ { id: '1-1', ...

weixin_33196646的博客 1731

JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换

JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换 目录 JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换 一、遍历树结构 二、列表和树结构相互转换 三、树结构筛选 四、树结构查找 五、结语 经常有同学问树结构的相关操作,也写了很多次,在这里总结一下 JS 树形结构一些操作的实现思路,并给出了简洁易懂的代码实现。 本文内容结构大概如下: JS树结构相关操作 一、遍历树结构 1. 树结构介绍 JS中树结构一般是类似于这样的结构: lettree=[ ...

happy81997的博客 256
上一篇: Markdown编辑器使用教程
Cohen 奕博
博客等级 码龄8年 34粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值