如何在 NSMutableDictionary 中搜索内容
How to search something in NSMutableDictionary
你好我有一个NSMutableArray
这样的
Contactarray (
{
"firstNAme"="name1"
"lastName"="name2"
"phoneNumber"="12345678902";
}
{
"firstNAme"="name1"
"lastName"="name2"
"phoneNumber"="12345678902";
}
我想在 UITextField
中输入人名时搜索此人。然后应该加载过滤后的UItableView
。此 NSMutableArray
包含 NSMutableDictionaries
。
如何从这些对象中找到匹配的对象?
假设我想搜索所有 name1 人。然后我想找到所有包含 "name1" 的对象,这些对象应该填充到另一个数组以加载 UITableview
请帮助我。
谢谢。
更新
这是我的联系人数组
<__NSArrayI 0x7b601f70>(
firstname = Kate;
lastName = Bell;
phone = "(415) 555-3695";
userimg = "<UIImage: 0x7b67b3a0>";
};
{
firstname = Kate;
lastName = Bell;
phone = "(415) 555-3695";
userimg = "<UIImage: 0x7b67b3a0>";
},
这是我的搜索代码
`
[playlistArray removeAllObjects];
NSArray *contacts=[[NSArray alloc] initWithArray:mutArraySearchContacts];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"firstname = %@ OR lastName = %@",currentSrchStr,currentSrchStr];
playlistArray=[contacts filteredArrayUsingPredicate:filter];
[self performSelectorInBackground:@selector(playlistsLoaded) withObject:nil];
`
但是我的playlistArray是空的。
`
(lldb) po playlistArray
<__NSArrayI 0x7b74adf0>(
)
`
我这里做错了什么?
您可以使用 keysOfEntriesPassingTest:
方法查找值等于 @"test"
的所有键。
在下面的实现中,只会找到第一个键。如果您需要对象为 @"Test"
的所有键,请不要分配 *stop
.
NSString *target = @"test";
NSSet *keys = [myDictionary keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
{
return (*stop = [target isEqual:obj]);
}];
当你拿到钥匙后,你可以继续下一步。
NSArray *contacts = ...; //your array of NSDictionary objects
NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"firstName == %@", @"name1"]];
NSArray *filteredContacts = [contacts filteredArrayUsingPredicate:filter];
如果您需要搜索更多条件,例如全名:
NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"firstName == %@ OR lastName == %@" ,@"name1", @"name2"]];
这里是Predicate Programming Guide,说明了更高级的功能。
使用 NSPredicate
时无需迭代。试试这个。
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"SELF['firstNAme'] contains '%@' || SELF['lastName'] contains '%@'",currentSrchStr,currentSrchStr]];
NSArray *filterArray = [mutArraySearchContacts filteredArrayUsingPredicate:myPredicate];
NSLog(@"filterArray %@", filterArray);
更新 1:
使用 CONTAIN[C]
修改谓词以区分大小写,例如
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"SELF['firstNAme'] CONTAINS[c] '%@' || SELF['lastName'] CONTAINS[c] '%@'",currentSrchStr,currentSrchStr]];
希望对您有所帮助!!
你好我有一个NSMutableArray
这样的
Contactarray (
{
"firstNAme"="name1"
"lastName"="name2"
"phoneNumber"="12345678902";
}
{
"firstNAme"="name1"
"lastName"="name2"
"phoneNumber"="12345678902";
}
我想在 UITextField
中输入人名时搜索此人。然后应该加载过滤后的UItableView
。此 NSMutableArray
包含 NSMutableDictionaries
。
如何从这些对象中找到匹配的对象?
假设我想搜索所有 name1 人。然后我想找到所有包含 "name1" 的对象,这些对象应该填充到另一个数组以加载 UITableview
请帮助我。 谢谢。
更新
这是我的联系人数组
<__NSArrayI 0x7b601f70>(
firstname = Kate;
lastName = Bell;
phone = "(415) 555-3695";
userimg = "<UIImage: 0x7b67b3a0>";
};
{
firstname = Kate;
lastName = Bell;
phone = "(415) 555-3695";
userimg = "<UIImage: 0x7b67b3a0>";
},
这是我的搜索代码
`
[playlistArray removeAllObjects];
NSArray *contacts=[[NSArray alloc] initWithArray:mutArraySearchContacts];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"firstname = %@ OR lastName = %@",currentSrchStr,currentSrchStr];
playlistArray=[contacts filteredArrayUsingPredicate:filter];
[self performSelectorInBackground:@selector(playlistsLoaded) withObject:nil];
`
但是我的playlistArray是空的。
`
(lldb) po playlistArray
<__NSArrayI 0x7b74adf0>(
)
`
我这里做错了什么?
您可以使用 keysOfEntriesPassingTest:
方法查找值等于 @"test"
的所有键。
在下面的实现中,只会找到第一个键。如果您需要对象为 @"Test"
的所有键,请不要分配 *stop
.
NSString *target = @"test";
NSSet *keys = [myDictionary keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
{
return (*stop = [target isEqual:obj]);
}];
当你拿到钥匙后,你可以继续下一步。
NSArray *contacts = ...; //your array of NSDictionary objects
NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"firstName == %@", @"name1"]];
NSArray *filteredContacts = [contacts filteredArrayUsingPredicate:filter];
如果您需要搜索更多条件,例如全名:
NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"firstName == %@ OR lastName == %@" ,@"name1", @"name2"]];
这里是Predicate Programming Guide,说明了更高级的功能。
使用 NSPredicate
时无需迭代。试试这个。
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"SELF['firstNAme'] contains '%@' || SELF['lastName'] contains '%@'",currentSrchStr,currentSrchStr]];
NSArray *filterArray = [mutArraySearchContacts filteredArrayUsingPredicate:myPredicate];
NSLog(@"filterArray %@", filterArray);
更新 1:
使用 CONTAIN[C]
修改谓词以区分大小写,例如
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"SELF['firstNAme'] CONTAINS[c] '%@' || SELF['lastName'] CONTAINS[c] '%@'",currentSrchStr,currentSrchStr]];
希望对您有所帮助!!