美文网首页go学习
Go巧用Map减少For循环

Go巧用Map减少For循环

作者: 我的名字叫浩仔 | 来源:发表于2017-03-16 11:47 被阅读559次

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

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

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

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

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

Paste_Image.png
应该是:
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循环

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

  • 第03天(复合类型)_map的基本使用

    24_map的基本使用.go 25_map赋值.go 26_map遍历.go 27_map删除.go 28_map...

  • Map

    常见操作:http://www.runoob.com/go/go-map.html 创建Map 赋值 遍历Map ...

  • Go语言——Map分析

    Go语言——Map分析 go\src\runtime\hashmap.go 简介 map就是一个hash表。数据被...

  • map集合优化

    通过map集合减少查询数据库次数 说明:将数据优先提取,减少访问数据库次数示例: 反例: 将嵌套for循环简化成单...

  • Golang之Map源码

    引用 深入 Go 的 Map 使用和实现原理 哈希表 深度解密Go语言之map Golang map 的底层实现 使用

  • Hive优化常识

    补充Map数 减少map数和增加Map数量

  • LeetCode之3Sum(Kotlin)

    问题: 方法:暴力解法可以通过三层循环,但是复杂度会达到三阶;通过生成map可以减少一次循环次数,然后进行两层循环...

  • 第九章:Go语言映射类型map

    1. map概述 Go语言中map字典类型时散列表(hash table)的实现,因为Go语言中将map中的每个键...

  • 07. Go极简教程 map的基础使用

    map的声明 map的操作 参考资料:http://go-tour-zh.appspot.com/ Go极简教程 ...

网友评论

    本文标题:Go巧用Map减少For循环

    本文链接:https://www.haomeiwen.com/subject/yendnttx.html