利用去语言怎么查找出两个数组不同的地方

  介绍

本篇文章给大家分享的是有关利用去语言怎么查找出两个数组不同的地方,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

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

输入:

arr_old: {“1”、“2”、“4”、“5”、“7”、“9“}

arr_new: {“2”,“3”、“4”、“6”、“7”;}

返回:

arr_added: {“3“,“6“}

arr_deleted: {“1“,“5”,“9“}

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

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

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

package 主要   import  (   ,“fmt"   )   func  main (), {   ,//fmt.Println (“Hello 世界!“)   ,src :=,[]字符串{“1“,,,2,,,“4”,,“5”,,,“7”,,“9“}   ,dest :=,[]字符串{“2”,“3”,,“4”,,“6”,,“7”;}   ,补充说,removed :=, Arrcmp (src,桌子)   ,fmt.Printf(非快速眼动睡眠“添加:% v \:, % v \ n",,,,删除)   }   func  Arrcmp (src []字符串,dest []字符串),([]字符串,[]字符串),{   ,msrc :=,使(map [string]字节),//按源数组建索引   ,mall :=,使(map [string]字节),//源+目所有元素建索引   ,var  set  [] string //交集//1。源数组建立地图   ,for  _, v :=, range  src  {   ,msrc [v],=0   ,商场[v]=0   ,}//2。目数组中,存不进的去,即重复元素,所有存不进去的集合就是并集   ,for  _, v :=, range  dest  {   ,l :=, len(购物中心)   ,商场[v]=1   ,if  l  !=, len(购物中心),{,//长度变化,即可以存=,l , len(购物中心)   {}大敌;else //存不了,进并集=,set 附加(集,v)   ,}   ,}//3。遍历交集,在并集中找,找到就从并集中删,删完后就是补集(即并-交=所有变化的元素)   ,for  _, v :=, range  set  {   ,删除(商场,v)   ,}//4。此时,购物中心是补集,所有元素去源中找,找到就是删除的,找不到的必定能在目数组中找的到,即新加的   ,var 补充道,deleted []字符串   ,for  v, _ :=, range  mall  {   ,_,exist :=, msrc [v]   ,if  exist  {=,deleted 添加(删除,v)   ,}else  {=,added 附加(补充道,,v)   ,}   ,}   ,return 添加、删除   }

运行结果:

添加:[6 3]

rem: [1 5 9]

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

<强>补充:去语言教程之浅谈数组和切片的异同

本期的分享我们来讲解一下关于去语言的数组和切片的概念,用法和区别。

在去语言的程序开发过程中,我们避免不了数组和切片。关于他们的用法和区别却使得有的小伙伴感觉困惑。所以小栈君这里也归纳和总结了关于数组和切片的干货帮助小伙伴进行理解。

<强>数组的定义

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形,字符串或者自定义类型。

相对于去声明number0, number1,……,number99的变量,使用数组形式数字[0],[1]数字……null

利用去语言怎么查找出两个数组不同的地方