Go巧用Map减少For循环

背景交代:
需要在一个学院、专业、班级的树中,在专业与班级节点插入年级节点,达到更好区分的目的。

原来格式:
|---Academy
|    |---Major
|         |---Class
目标格式:
|---Academy
|    |---Major
|         |---Grade
|              |---Class

本想利用Class中含有的Grade属性替换原有的父节点Major,再将Grade作为节点,其父节点置为原有的父节点Major。

子节点 父节点
old 15级1班 法学
new 15级1班 2015
2015 法学

由于Grade属性依附在在Class,生成的结构不符合要求!

Go巧用Map减少For循环_第1张图片
Paste_Image.png

应该是:
Go巧用Map减少For循环_第2张图片
Paste_Image.png
所以要把已经生成的年级节点记录一下,再有相同的专业下的年级节点,便不再生成了。

代码如下,利用一个Map存储已经生成的年级节点,如果已经生成年级节点,直接将该班级节点的父节点置为已经生成的年级节点。

func (abp *APIBasicParameterHandle) addGradeData(classData []map[string]string) []map[string]string {
    // 存放年级节点
    var gradeData []map[string]string
    // 用于记录是否已生成年级节点
    tmpMap := make(map[string]string)
    count := 1
    for _, vo := range classData {

        gradeName := vo["GradeName"]
        majorName := vo["ParentDepartName"]
        if t, ok := tmpMap[gradeName+majorName]; ok {
            vo["ParentDepartCode"] = t
            vo["ParentDepartName"] = gradeName
            continue
        }
        gradeCode := utility.NewUuid()
        gradeOrganization := make(map[string]string)
        gradeOrganization["DepartmentCode"] = gradeCode
        gradeOrganization["DepartmentName"] = gradeName
        gradeOrganization["Level"] = "5"
        gradeOrganization["ParentDepartCode"] = vo["ParentDepartCode"]
        gradeOrganization["ParentDepartName"] = vo["ParentDepartName"]
        gradeOrganization["Squence"] = strconv.Itoa(count)
        gradeData = append(gradeData, gradeOrganization)

        tmpMap[gradeName+majorName] = gradeCode
        vo["ParentDepartCode"] = gradeCode
        vo["ParentDepartName"] = gradeName
        delete(vo, "GradeName")
        count++
    }
    classData = append(classData, gradeData...)
    return classData
}

之前判断是否已经生成年级节点的方式是:循环classData判断class的父节点是否还是原先的节点。这样会多出两个for循环,循环中有很多重复判断数据。临时建立TmpMap,以"GradeName"+"MajorName"为Key,每次进入循环,判断该Key是否存在。如果存在,则该节点已经生成,直接将TmpMap中Key对应的Value更新为Class的父节点;如果不存在,则生成该年级节点,将该节点暂存,增加TmpMap对应关系,将Class的父节点更新。

你可能感兴趣的:(Go巧用Map减少For循环)