两种语言实现的树结构
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\n", 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": [
{
浙公网安备 33010602011771号