如何判断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
而不是有两个嵌套的循环,你有一个循环,它只是迭代次数最小的数组。