如何判断2个数组是否共享相同的元素

所以这是我的问题的一个更简单的forms。 可以说我有2个数组。 A = {1,2}和B = {2,4,6}。 如果A和B共享一个元素,那么从B中删除这个元素。我知道你可以遍历并比较A中的每个元素到B中的每个元素,但是有一个更好的方法!

如果你的数组是sorting的(或者你可以对数组进行sorting),那么你可以同时处理两个数组。 从这两个数组的开始处开始,直到您将超出其相应数组末尾的其中一个指针前进:

  • 如果一个<b则提前一个指针
  • 如果a = b,则删除b处的元素
  • 如果a> b,则提前b指针

你必须编写代码,但它不一定是一个powershell嵌套循环,你不必做任何杂乱的从数组中删除单个元素。

如果您添加对Microsoft脚本运行时的引用(从VBE的“工具”菜单中),则可以使用Dictionary对象来简化操作。 它有“存在”,“删除”和“键”的方法。 所以你可以循环遍历B并在Dictionary中添加元素作为关键字,然后循环遍历A,检查这些元素是否存在,如果是,则删除它们。

作为伪代码:

for each elem in b dict(elem)=0 next elem for each elem in a if dict.exists(elem) dict.remove(elem) end if next elem return dict.keys 

如果有的话,上面的方法也会删除B中的重复项。

如果你知道你的数组没有错误值作为元素,你也可以使用MATCH(和VBA中的Application.Match或Application.WorksheetFunction.Match)。 做类似的事情

 =MATCH({2,4,6},{1,2},0) 

将返回{2,#N / A,#N / A}。 任何具有#N / A的位置都是B中不在A中的元素的位置。如果在工作表中进行了匹配,则可以将公式

 =IF(ISNA(cell of match),corresponding cell of B,NA()) 

然后过滤出#N / As。 在VBA中,你可以做(​​更多的伪代码):

 matches=application.match(b,a,0) for each elem in matches if iserror(elem) add corresponding element of b to result end next elem redim result to new smaller size return result 

当然,那么你不得不担心数组的起始界限等

不,我不觉得。 你必须循环。

如果数组内的值对于其数组是唯一的,则可以使数组索引实际值,从而允许您直接查找其索引,而不是扫描整个数组。

从元素数量较less的数组开始,我假设你想要做excel / VB? 我画了一张照片来说明这个想法。

http://img694.imageshack.us/img694/1503/hackmap.jpg

而不是有两个嵌套的循环,你有一个循环,它只是迭代次数最小的数组。