zoukankan      html  css  js  c++  java
  • 两种语言实现的树结构

    golang

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"go_study3/sql"
    	"strconv"
    	"strings"
    )
    
    /**
    将一条记录添加到树
    */
    
    type treeNode struct {
    	Name     string
    	Id       string
    	IsTeam   bool
    	Children *[]treeNode
    	Position string
    }
    
    // result是一个列表,每个item是一个字典,如果 team = 字典["Name"] 则返回这个item
    func getChildrenByTeam(team string, result *[]treeNode) *[]treeNode {
    	for _, v := range *result {
    		if team == v.Name {
    			return v.Children
    		}
    	}
    	fmt.Println("执行到这里了")
    	return nil
    }
    
    func getTeamInChildren(team string, children *[]treeNode) *treeNode {
    	for _, child := range *children {
    		if team == child.Name {
    			return &child
    		}
    	}
    	return nil
    }
    
    func getChildren(teams []string, i int, result *[]treeNode) *[]treeNode {
    	tmp := result
    	tmpTeams := teams[:i]
    	for _, team := range tmpTeams {
    		tmp = getChildrenByTeam(team, tmp)
    	}
    	return tmp
    }
    
    func addOneItem(user sql.User, result *[]treeNode) {
    	// 出现异常了恢复
    	defer func() {
    		err := recover()
    		if err != nil {
    			fmt.Println("ERROR,内容如下", user, err)
    		}
    	}()
    
    	position := user.Position
    	teams := strings.Split(strings.Trim(position, "/"), "/")
    
    	children := new([]treeNode)
    	teamStruct := new(treeNode)
    	count := 0
    
    	for i, team := range teams {
    		if i == 0 {
    			children = result
    		} else {
    			children = getChildren(teams, i, result)
    		}
    
    		teamStruct = getTeamInChildren(team, children) // team对象 的指针
    
    		if teamStruct == nil {
    			tmp := treeNode{
    				Name:     team,
    				IsTeam:   true,
    				Id:       strconv.Itoa(count),
    				Children: new([]treeNode),
    			}
    			teamStruct = &tmp
    			*children = append(*children, tmp)
    			count++
    
    			//fmt.Println(children)
    			//fmt.Println(result)
    		}
    	}
    	node := treeNode{
    		Name:     user.Username,
    		Id:       user.Id,
    		IsTeam:   false,
    		Children: nil,
    		Position: user.Position,
    	}
    
    	*teamStruct.Children = append(*teamStruct.Children, node)
    }
    
    func main() {
    	fmt.Println("hello")
    
    	users := sql.QueryMultiRowDemo2(3000)
    
    	result := make([]treeNode, 0)
    	fmt.Printf("result = %p
    ", result)
    	for _, user := range users {
    		fmt.Println(user)
    		if user.Position != "" {
    			addOneItem(user, &result)
    		}
    	}
    	fmt.Println(result)
    
    	strByte, err := json.Marshal(result)
    	if err != nil {
    		fmt.Println("err", err)
    	} else {
    		strJson := string(strByte)
    		fmt.Println(strJson)
    	}
    
    }
    

      python

    """
        Created by yang on 2020/10/14
        dim 用户-树形结构
    """
    import json
    
    from test01.dbUtils import MysqlConn
    
    
    def get_children_by_team(team, result):
        """
        result是一个列表,每个item是一个字典,如果 team = 字典["name"] 则返回这个item
        :return:
        """
        for item in result:
            if team == item["name"]:
                return item["children"]
    
    
    def team_in_children(team, children):
        for item in children:
            if team == item["name"]:
                return True
        return False
    
    
    def get_children(teams: list, i: int, result: list):
        """
        寻找最内层的children  是一个list
        :param teams:
        :param i:
        :param result:
        :return:
        """
        tmp = result
        tmp_teams = teams[:i]
        for team in tmp_teams:
            tmp = get_children_by_team(team, tmp)
        return tmp
    
    
    id = 0
    
    
    def add_one_item(item, result: list):
        """
        将一条记录添加到树
        :param item:
        :param result:
        :return:
        """
        if not item["Position"]:
            return
        position = item["Position"]
        print(position)
        teams = position.strip("/").split("/")
        global id
        children = []
        for i, team in enumerate(teams):
            if i == 0:
                children = result
            else:
                children = get_children(teams, i, result)
    
            if not team_in_children(team, children):
                tmp = {
                    "name": team,
                    "is_team": True,
                    "id": id,
                    "children": []
                }
                children.append(tmp)
                id += 1
    
        item["id"] = item.pop("Id")
        item["name"] = item.pop("Nickname")
        item["is_team"] = False
    
        children[-1]["children"].append(item)
    
    
    def f1():
        conn = MysqlConn("200.200.84.30", "mmuser", "mostest")
        res = conn.execSql("select Id,Nickname,Position from `mattermost_test`.`Users` limit 10")
        result = []
        for item in res:
            add_one_item(item, result)
        print(json.dumps(result, indent=4, ensure_ascii=False))
    
    
    if __name__ == '__main__':
        f1()
    

      树结构

    [
        {
            "name": "",
            "is_team": true,
            "id": 0,
            "children": [
                {
                    "name": "",
                    "is_team": true,
                    "id": 1,
                    "children": [
                        {
                            "name": "",
                            "is_team": true,
                            "id": 2,
                            "children": [
                                {
                                    "name": "",
                                    "is_team": true,
                                    "id": 3,
                                    "children": [
                                        {
                                            "name": "",
                                            "is_team": true,
                                            "id": 4,
                                            "children": [
                                                {
                                                    "Position": "",
                                                    "id": "",
                                                    "name": "",
                                                    "is_team": false
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            "name": "",
                            "is_team": true,
                            "id": 15,
                            "children": [
                                {
                                    "name": "",
                                    "is_team": true,
                                    "id": 16,
                                    "children": [
                                        {
                                            "name": "",
                                            "is_team": true,
                                            "id": 17,
                                            "children": [
                                                {
                                                    "Position": "",
                                                    "id": "",
                                                    "name": "",
                                                    "is_team": false
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                },
                {
                    "name": "",
                    "is_team": true,
                    "id": 5,
                    "children": [
                        {
                            "name": "",
                            "is_team": true,
                            "id": 6,
                            "children": [
                                {
                                    "name": "",
                                    "is_team": true,
                                    "id": 7,
                                    "children": [
                                        {
                                            "Position": "",
                                            "id": "",
                                            "name": "",
                                            "is_team": false
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "name": "公司2",
            "is_team": true,
            "id": 8,
            "children": [
                {
                    "name": "",
                    "is_team": true,
                    "id": 9,
                    "children": [
                        {
                            "name": "",
                            "is_team": true,
                            "id": 10,
                            "children": [
                                {
                     
    

      

  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/jec1999/p/13827303.html
Copyright © 2011-2022 走看看