package main
import (
"fmt"
)
//记录每次计算的叶子节点
var leafMap= make(map[string][]string)
//记录已经排好顺序的节点
var sortJobs = []string{}
//往map里边放job,key为name,value为job依赖的job名
func createJob(jobMap map[string][]string,name string, dep []string) {
jobMap[name] = dep
}
//递归计算job的依赖,每次从map中删除掉无依赖的类似叶子节点的key
func assignJob(jobMap map[string][]string) {
job :=""
for k,v := range jobMap {
if(len(v) == 0){
job += k
createJob(leafMap,k,v)
delete(jobMap,k)
}
}
sortJobs = append(sortJobs,job)
for k,v := range jobMap {
for i,dep := range v {
if _,ok := leafMap[dep]; ok {
v = append(v[:i], v[i+1:]...)
jobMap[k] = v;
}
}
}
if(len(jobMap)>0){
assignJob(jobMap)
}
}
func main(){
fmt.Println("start")
//初始化一个job 集合
jobMap := make(map[string][]string)
createJob(jobMap,"a",[]string{"b"})
createJob(jobMap,"b",[]string{"c","d"})
createJob(jobMap,"c",nil)
createJob(jobMap,"d",[]string{"e"})
createJob(jobMap,"e",nil)
//递归计算job依赖
assignJob(jobMap)
//打印排好顺序的job列表
fmt.Println(sortJobs)
}