内部循环定义父链接

时间:2019-05-13 06:42:34

标签: go

我想循环显示表的名称,以添加由符号“ _”定义的关联。

如果表a_ba存在b,则a = [b]b = [a]。 最后,我不必打印名称中包含“ _”的表

结构

// Table with Fields and Assoc
type Table struct {
    Name       string
    Assoc      []Assoc
}

// Assoc is a name of associated Table
type Assoc struct {
  Name string
}
tables := []string{
    "a",
    "b",
    "c",
    "d",
    "f",
    "a_b",
    "a_c",
    "a_d_f",
    "c_d",      
}

var tbls []Table

for _, t := range tables {
    if strings.Contains(t, "_") {
        // Split to find "_" like assoc := strings.Split(t, "_") ?
        // append in struct "Table{Name:a, Assoc:  [b,c,d,f]}"
        // append in struct "Table{Name:b, Assoc:  [a]}"
        // append in struct "Table{Name:c, Assoc:  [a,d]}"
        // append in struct "Table{Name:d, Assoc:  [a,c,f]}"
        // append in struct "Table{Name:f, Assoc:  [a,d]}"      
    } else {
        n := Table{
            Name: t,
        }
        tbls = append(tbls, n)
    }

}

fmt.Println(tbls)一样返回:

[{a [b,c,d,f]} {b [a]} {c [a,d]} {d [a,c,f]} {f [a,d]}]

Go Playground

1 个答案:

答案 0 :(得分:0)

使用地图完成上述操作 https://play.golang.org/p/8C5M0L-es6o

package main

import (
    "fmt"
    "strings"
)

// Table with Fields and Assoc
type Table struct {
    Name  string
    Assoc map[string]int
}

// Assoc is a name of associated Table
// type Assoc struct {
//  Name string
// }

func main() {
    tables := []string{
        "a",
        "b",
        "c",
        "d",
        "f",
        "a_b",
        "a_c",
        "a_d_f",
        "c_d",
    }

    var tbls = make(map[string]map[string]int)

    for _, t := range tables {
        if strings.Contains(t, "_") {
            splitAssocs := strings.Split(t, "_")            
            for i:=0;i<=len(splitAssocs)-2;i++ {
                for j:=(i+1);j<=len(splitAssocs)-1;j++{
                    _, ok := tbls[splitAssocs[i]]
                    if !ok{
                        tbls[splitAssocs[i]] = make(map[string]int)
                    }
                     _, ok = tbls[splitAssocs[j]]
                    if !ok{
                        tbls[splitAssocs[j]] = make(map[string]int)
                    }
                    tbls[splitAssocs[i]][splitAssocs[j]] = 1
                    tbls[splitAssocs[j]][splitAssocs[i]] = 1
                }

            }

        } else {
            _, ok := tbls[t]            
            if !ok{
                tbls[t] = make(map[string]int)
            }
        }

    }

    fmt.Println(tbls)
}