这篇文章给大家介绍使用Go语言怎么查找两个数组的异同,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。输入是两个数组,一个旧数组一个新数组,要求获取新数组相对旧数组所有新增和删除的元素,例如:输入:arr_old:&nbs
这篇文章给大家介绍使用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 mainimport ("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.源数组建立mapfor _, v := range src {msrc[v] = 0mall[v] = 0}//2.目数组中,存不进去,即重复元素,所有存不进去的集合就是并集for _, v := range dest {l := len(mall)mall[v] = 1if l != len(mall) { //长度变化,即可以存l = len(mall)} else { //存不了,进并集set = append(set, v)}}//3.遍历交集,在并集中找,找到就从并集中删,删完后就是补集(即并-交=所有变化的元素)for _, v := range set {delete(mall, v)}//4.此时,mall是补集,所有元素去源中找,找到就是删除的,找不到的必定能在目数组中找到,即新加的var added, deleted []stringfor 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语言实现查找两个数组的异同的详细内容,更多请关注编程网其它相关文章!
关于使用go语言怎么查找两个数组的异同就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
--结束END--
本文标题: 使用go语言怎么查找两个数组的异同
本文链接: https://lsjlt.com/news/278919.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0