Jquery中文网 www.jquerycn.cn
Jquery中文网 >  后端编程  >  Go语言  >  正文 用go语言实现查找两个数组的异同

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

发布时间:2021-04-09   编辑:www.jquerycn.cn
jquery中文网为您提供用go语言实现查找两个数组的异同等资源,欢迎您收藏本站,我们将为您提供最新的用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语言实现查找两个数组的异同”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
想系统学习GO语言(Golang
用go语言实现查找两个数组的异同
Go 语言十年而立,Go2 蓄势待发
Go语言发展历史、核心、特性及学习路线
从零开始学习GO语言-搭建Go语言开发环境-快速开发入门第一个小程序
go语言有哪些优势?Go语言的核心特性有哪些
基于类型系统的面向对象编程语言Go
go 函数末尾缺少返回值_王垠:Go语言野心勃勃,实际情况又如何
Go 语言的核心优势
Go语言学习3----Go语言特色

[关闭]