如何按值过滤 NSDictionary 并从中创建新的 NSDictionary?
How to filter NSDictionary by value and create new NSDictionary from that?
我有一个日期列表,格式为 yyyyMMdd
long
。我用 key yyyyMMdd
和 value yyyyMM
(如 NSString
)创建了字典。我需要过滤 NSDictionary
(通过 value
)并创建一个新的表单。怎么做?
备注:我想这是重复的,但我不知道该怎么做。
编辑:
我不明白为什么我的问题被标记为 duplicate 问题解决我的问题是 C#?
据我所知(我对 objective-C 的了解有限)语法非常不同。我也不知道 objective-C 中的 linq
或 lambdas
。
有多种方法可以做到这一点(包括您认为笨拙的方法)。这是一个:
NSArray* keys = [dict keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop){
// return YES or NO depending on whether the value (in "obj") passes your test
}];
NSDictionary* newDict = [dict dictionaryWithValuesForKeys:keys];
请注意,-dictionaryWithValuesForKeys:
在应用于字典时,可能会对以“@”开头的键执行一些意想不到的操作。那是因为它是根据 -valueForKey:
实现的,并且 NSDictionary
对该方法的实现特别对待这些键。对于您描述的情况应该无关紧要。
所以我仍然不能 100% 确定您想做什么,以及为什么要这样做。
但是看看这个:
// create a new dict for this example, you can just use ur existing one
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"201506", @"20150601",
@"201505", @"20150501", nil];
NSArray *resultArray = [[dict allValues] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == %@", @"201506"]];
// testing the output
NSLog(@"%@", resultArray);
你最终没有字典,而是一个数组,其中包含你从字典中过滤的值。也许您必须根据需要调整谓词并将 resultArray 内容放回字典中,但我不知道您的结果应该是什么样子。
//old dictionary stores @{date: string} ,where data = NSDate; string = NSString from NSDate
NSMutableArray * storedValues = [[oldDictionary allValues]mutableCopy];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > %@",[NSDate date]];
NSArray *sortedArray = [storedValues filteredArrayUsingPredicate:predicate];
NSMutableDictionary *newDictionary = [NSMutableDictionary dictionary];
for(NSDate *date in sortedArray) {
NSArray *keys = [oldDictionary allKeysForObject:date];
NSString *key = keys.firstObject;
[newDictionary setObject:date forKey:key];
}
我有一个日期列表,格式为 yyyyMMdd
long
。我用 key yyyyMMdd
和 value yyyyMM
(如 NSString
)创建了字典。我需要过滤 NSDictionary
(通过 value
)并创建一个新的表单。怎么做?
备注:我想这是重复的,但我不知道该怎么做。
编辑:
我不明白为什么我的问题被标记为 duplicate 问题解决我的问题是 C#?
据我所知(我对 objective-C 的了解有限)语法非常不同。我也不知道 objective-C 中的 linq
或 lambdas
。
有多种方法可以做到这一点(包括您认为笨拙的方法)。这是一个:
NSArray* keys = [dict keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop){
// return YES or NO depending on whether the value (in "obj") passes your test
}];
NSDictionary* newDict = [dict dictionaryWithValuesForKeys:keys];
请注意,-dictionaryWithValuesForKeys:
在应用于字典时,可能会对以“@”开头的键执行一些意想不到的操作。那是因为它是根据 -valueForKey:
实现的,并且 NSDictionary
对该方法的实现特别对待这些键。对于您描述的情况应该无关紧要。
所以我仍然不能 100% 确定您想做什么,以及为什么要这样做。
但是看看这个:
// create a new dict for this example, you can just use ur existing one
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"201506", @"20150601",
@"201505", @"20150501", nil];
NSArray *resultArray = [[dict allValues] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == %@", @"201506"]];
// testing the output
NSLog(@"%@", resultArray);
你最终没有字典,而是一个数组,其中包含你从字典中过滤的值。也许您必须根据需要调整谓词并将 resultArray 内容放回字典中,但我不知道您的结果应该是什么样子。
//old dictionary stores @{date: string} ,where data = NSDate; string = NSString from NSDate
NSMutableArray * storedValues = [[oldDictionary allValues]mutableCopy];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > %@",[NSDate date]];
NSArray *sortedArray = [storedValues filteredArrayUsingPredicate:predicate];
NSMutableDictionary *newDictionary = [NSMutableDictionary dictionary];
for(NSDate *date in sortedArray) {
NSArray *keys = [oldDictionary allKeysForObject:date];
NSString *key = keys.firstObject;
[newDictionary setObject:date forKey:key];
}