【问题标题】:VBA: Filter array based on another arrayVBA:基于另一个数组过滤数组
【发布时间】:2016-03-28 13:24:02
【问题描述】:

我没有找到任何东西。我想要实现的是根据另一个数组m x 1 过滤掉一个[n x 3] 数组

让我们这么说:

arr1 = [n x 3] 'where n is roughly 500'000
arr2 = [m x 1] 'where m is roughly 500

arr1 结构如下:

arr1(1,1) = ID1 | arr1(1,2) = String1 | arr1(1,3) = Bolean1
arr1(2,1) = ID2 | arr1(2,2) = String2 | arr1(2,3) = Bolean2

arr2 结构如下:

arr2 (1) = ID2 | arr2 (2) = ID23 | arr2 (3) = ID345 | arr2 (4) = ID4567 | arr2 (5) = ID6381

我需要做的是过滤arr1 以排除所有那些arr1(i,1) 包含在arr2arr1(i,2) <> "String2" 中的记录。然后将过滤后的数组粘贴到工作表上

【问题讨论】:

  • 我建议将arr2 替换为Dictionary object。它像哈希表一样工作,因为您使用值作为键。您可以测试它是否存在而不循环。否则,您可能会使用 Match / Index 但这听起来很慢......
  • 感谢@WhiteHat,我一定会调查的

标签: arrays excel vba


【解决方案1】:

向 arr1 添加一个额外的字段 arr1 是 [n x 4]

  1. 将额外字段设为布尔值,初始化为 False

  2. 遍历 arr2,对于 arr2 中的每个 ID,将 arr1 中的相应条目设置为 True,例如 如果我们在 arr2 中找到 ID23,并且在 arr1(x,1) 处找到 ID23,则设置 arr1(x,4) = True

  3. 一次将 arr1 复制到新的数组行,只复制 arr1(x,4) = False 的项

您也可以考虑使用类而不是多维数组。然后,您可以构建集合并使用 For Each 逐步完成它们。这可以更快地运行,并且可以更轻松地添加新字段。

【讨论】:

  • 我认为这种方法迫使我先循环n,然后循环m。我对吗?如果是这样,因为n = 500'000m = 500 需要太长时间
  • 如果 arr1 中的 ID 是按数字顺序排列的,那么执行二分查找将显着提高速度。如果可能的话,在构建 arr1 时在代码中更早地执行检查可能会更有效。如果 arr1 中的 ID 是随机顺序但 arr2 是数字顺序,那么遍历 arr1 并在 arr2 上对 arr1 中的每个项目使用二进制搜索会更快。如果两者都是随机的,则单步执行 arr2 并构建一个有序的条目列表。然后单步执行 arr1 并在有序列表中使用二分搜索。
  • 两者都是随机顺序。如果我直接过滤一个范围?是否可以根据变量数组中的值过滤范围?
  • 我不知道有什么方法,但是如果我要为随机数组编码,arr2 更小,arr1 很大,我会先构建一个有序版本的 arr2,然后一步通过 arr1 并为每个条目检查其 ID 是否在 arr2 的有序版本中。此检查可以使用快速二进制搜索。不在 arr2 中的每个项目都可以添加到输出列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多