Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 基于谓词键的另一个数组使用谓词筛选数组_Ios_Iphone_Arrays_Xcode_Nsmutablearray - Fatal编程技术网

Ios 基于谓词键的另一个数组使用谓词筛选数组

Ios 基于谓词键的另一个数组使用谓词筛选数组,ios,iphone,arrays,xcode,nsmutablearray,Ios,Iphone,Arrays,Xcode,Nsmutablearray,大家好,这可能是一个愚蠢的问题,以前可能会被问到,我想用谓词过滤数组。我有一个数组,其中包含如下相同类型的字典 <NSArrayM>( ID:54d3ca82535c12243400c254 Room JID:(null) name:(null) photo:(null) type:3

大家好,这可能是一个愚蠢的问题,以前可能会被问到,我想用谓词过滤数组。我有一个数组,其中包含如下相同类型的字典

<NSArrayM>(
ID:54d3ca82535c12243400c254                      
Room JID:(null)                      
name:(null)                      
photo:(null)                      
type:3                      
lastMessage:Gand                      
lastMessageDate:2015-02-05 20:02:47 +0000                      
occupantIDs:(
2285222,
2285224
)                      
userID:2285224                      
unreadMessagesCount:4                      
lastMessageUserID:2285224
)
任何答案都可以

如果您使用:

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SUBQUERY(occupantIDs, $x, $x == %@).@count > 0 AND SUBQUERY(occupantIDs, $x, $x == %@).@count > 0", @2285222,@2285224];
这将匹配
职业ID
数组同时包含2285222和2285224(也可能包含其他职业ID)的任何项目

如果要排除那些也有其他职业ID的项目,请使用以下命令:

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SUBQUERY(occupantIDs, $x, $x == %@).@count > 0 AND SUBQUERY(occupantIDs, $x, $x == %@).@count > 0 AND SUBQUERY(occupantIDs, $x, $x != %@ AND $x != %@).@count = 0", @2285222,@2285224,@2285222,@2285224];
为了解释它们是如何工作的:首先,每个%@都被参数列表中相应的项(@2285222,等等)替换。因此,第一个子查询变成“子查询(职业ID,$x,$x==2285222)”。这相当于“通过测试每个元素“$x”是否等于2285222来过滤数组“职业ID”。(请注意,“$x”是元素的任意名称-可以是“$y”或任何您喜欢的名称。)“@count>0”然后检查此过滤数组是否有任何项。换句话说,至少有一个职业ID与2285222匹配

第二个子查询基本相同,但适用于2285224。因此,您可以将整个谓词解释为“包括那些Occupntids数组中有任何匹配2285222的元素和任何匹配2285224的元素的项”


为了排除也有其他职业ID的项目,我添加了另一个条款,该条款使用相同的技术仅包括职业ID数组中没有与2285222或2285224不匹配的项目的项目。

您能否澄清:是否要包括a)任何居住者与2285222或2285224匹配的房间,或者b)2285222和2285224都是居住者?你想包括除这两个之外还有其他职业的房间吗?职业ID是已知的,所以只有这些,我想根据它们进行过滤。如果我们能从使用其中任何一种方法中得到结果,那么对我的案例来说也很好,但我建议最好同时使用这两种方法进行比较。谢谢你的努力。你的解决方案对我有效,但你能简单地告诉我这将如何比较吗?我会在我的回答中解释。非常感谢你的努力。
NSPredicate *filter = [NSPredicate predicateWithFormat:@"SUBQUERY(occupantIDs, $x, $x == %@).@count > 0 AND SUBQUERY(occupantIDs, $x, $x == %@).@count > 0 AND SUBQUERY(occupantIDs, $x, $x != %@ AND $x != %@).@count = 0", @2285222,@2285224,@2285222,@2285224];