0

我很难为我的搜索功能编写谓词,并认为您会提供帮助。所以基本上我有两个 NSNumbers 数组。我希望我的谓词满足以下条件:

If a number's integerValue in array A matches any integerValue in array B.

我不想为此解决方案使用任何类型的循环。这是我到目前为止所拥有的

ANY integerValue == ANY //how do I pass the entire array here and ask for the integerValue of each member? 
4

2 回答 2

5

ANY 运算符将处理该问题。

由于从您的问题中很难说在正常谓词用语中哪个数组是“自我”,因此我将在没有自我的情况下编写它:

NSArray *arrayA = @[@2, @3, @7];
NSArray *arrayB = @[@2, @4, @9];

NSPredicate *pred = [NSPredicate predicateWithFormat: @"ANY %@ IN %@", arrayA, arrayB];

由于缺少“自我”,因此必须将其nil作为对象进行评估,但这可以正常工作:

BOOL matched = [pred evaluateWithObject: nil];

如果您更喜欢在谓词中包含“自我”,您可以输入它:

NSPredicate *pred = [NSPredicate predicateWithFormat: @"ANY self IN %@", arrayB];
BOOL matched = [pred evaluateWithObject: arrayA];

结果是一样的。

一个小的概念性评论

如果两个数组中都包含任何整数,则上面的谓词评估为真,这就是我阅读您的问题的方式。

这意味着,从概念上讲,您似乎是在测试两组数字是否相互交叉。NSSet的方法 intersectsSet:会检查这一点,因此另一种进行测试的方法是将您的数字保持为集合并测试交叉点:

matched = [setA intersectsSet: setB];
于 2013-06-17T15:16:18.237 回答
0

我知道这不是您所要求的(谓词和所有),但另一种方法是使用NSArray's ,如果找不到公共对象- (id) firstObjectCommonWithArray:(NSArray *)otherArray,它将返回。nil

BOOL arraysIntersect = [array1 firstObjectCommonWithArray:array2] != nil;

不过需要注意的是,它会在比较两个对象时使用自己的对象相等规则,这意味着如果两个对象是 NSNumber 实例,它将使用NSNumber'compare:方法比较它们。但是到目前为止提出的基于谓词的解决方案也是如此。

于 2013-06-17T15:21:01.723 回答