这里有一个替代方案:识别一个类的实例可能具有的所有可能的属性。在您的示例中,您有一个person
具有两个属性的类;姓名和年龄。因为您有这些属性的吸气剂,所以 aperson
最多可能有两个属性(除非还有其他您没有提到的吸气剂)。您可以实现person
将属性保存在一个集合中,这样您实际上对属性的数量没有限制。不管它是如何实现的,确定所有的属性。
现在对于每个属性,关联一个唯一的素数,然后为每个实例person
维护与分配给它的那些属性对应的那些素数的乘积person
。例如,假设一个人可以是年轻或年老、男性或女性、长相好或长相不佳。这是 6 个属性,让我们按如下方式分配质数:
02: young
03: old
05: male
07: female
11: good looking
13: bad looking
继续这个例子,假设一个人是一个漂亮的年轻女性。素数的乘积将是 2 X 7 X 11 或 154。
现在你想找到所有好看的年轻人,不分性别。与此谓词相关的素数的乘积是 2 X 11 或 22。
因此,您现在可以遍历所有的people
,如果与每个相关的素数乘积people
可以除以 22 而没有任何余数(在person
素数乘积为 154 的情况下可以),那么您就有了匹配项。
您可能希望使用 BigNumber 类来执行素数乘积的乘法、除法和存储。
如果给定 a 并询问它是否匹配所有谓词,则此解决方案非常快person
(同样,谓词已简化为唯一的素数,并且谓词的集合现在由这些素数的乘积表示)。
如果您必须遍历整个people
查找匹配项的集合,此解决方案可能不会那么快。