• 技术文章 >后端开发 >Golang

    详解用go语言实现查找两个数组的异同

    藏色散人藏色散人2021-06-02 17:07:35转载106
    下面由golang教程栏目给大家介绍用go语言实现查找两个数组的异同,希望对需要的朋友有所帮助!

    最近项目上碰到个小需求,输入是两个数组,一个旧数组一个新数组,要求获取新数组相对旧数组所有新增和删除的元素,例如:

    输入:
    arr_old: {"1", "2", "4", "5", "7", "9"}
    arr_new: {"2", "3", "4", "6", "7"}
    返回:
    arr_added: {"3", "6"}
    arr_deleted: {"1", "5", "9"}

    go的标准库中没有类似的直接比较的方法,需要自己具体实现,最简单的方法当然是旧数组的每个元素去新数组,找不到的就是删除的,然后新数组的元素再挨个去旧数组找一遍,找不到就是新增的,但这个方法效率实在太低了。

    这里我使用了一种基于集合运算的思想,即分别求两个数组的交集和并集,并集减去交集就是所有发生变化的元素(要么是新增的,要么是删除的),遍历这个集合中的元素去旧数组中查找,如果在旧数组中找到,那么就是删除掉的元素;反之,如果找不到,则一定能在新数组中找到(用不着真的再去遍历一次),那么就是新增的元素。

    上代码,这里有个技巧,就是利用go中map键唯一性的特性,用数组的元素作为map的key,通过map来实现快速查找。

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	//fmt.Println("Hello World!")
    	src := []string{"1", "2", "4", "5", "7", "9"}
    	dest := []string{"2", "3", "4", "6", "7"}
    
    	added, removed := Arrcmp(src, dest)
    	fmt.Printf("add: %v\nrem: %v\n", added, removed)
    }
    
    func Arrcmp(src []string, dest []string) ([]string, []string) {
    	msrc := make(map[string]byte) //按源数组建索引
    	mall := make(map[string]byte) //源+目所有元素建索引
    
    	var set []string //交集
    
    	//1.源数组建立map
    	for _, v := range src {
    		msrc[v] = 0
    		mall[v] = 0
    	}
    	//2.目数组中,存不进去,即重复元素,所有存不进去的集合就是并集
    	for _, v := range dest {
    		l := len(mall)
    		mall[v] = 1
    		if l != len(mall) { //长度变化,即可以存
    			l = len(mall)
    		} else { //存不了,进并集
    			set = append(set, v)
    		}
    	}
    	//3.遍历交集,在并集中找,找到就从并集中删,删完后就是补集(即并-交=所有变化的元素)
    	for _, v := range set {
    		delete(mall, v)
    	}
    	//4.此时,mall是补集,所有元素去源中找,找到就是删除的,找不到的必定能在目数组中找到,即新加的
    	var added, deleted []string
    	for v, _ := range mall {
    		_, exist := msrc[v]
    		if exist {
    			deleted = append(deleted, v)
    		} else {
    			added = append(added, v)
    		}
    	}
    
    	return added, deleted
    }

    运行结果:

    add: [6 3]
    rem: [1 5 9]

    欢迎大家交流效率更高的方法。

    以上就是详解用go语言实现查找两个数组的异同的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:go语言
    上一篇:关于Go语言命令行压力测试工具Wrk 下一篇:Go怎么实现字符串首字母大、小写函数
    第16期线上培训班

    相关文章推荐

    • 记录Go语言采坑记录gob序列化坑• 分享一个go语言采坑:闭包共享变量问题• 介绍基于GO语言框架Gin开发的MVC轮子框架:GinLaravel• 关于Go语言命令行压力测试工具Wrk

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网