我设置了以下字典(对象,密钥)
0, "10;0.75,0.75"
1, "0;2.25,2.25"
3, "1;3.5,2.0"
4, "1;4.5,3.0"
5, "2;6.0,5,0"
我想要过滤的内容将基于对象和密钥。该对象是NSNumber。键是一个字符串,但我真的不想要整个字符串。我想拆分由分号分隔的字符串,并取分裂的第一个索引,这将产生字符串10,0,1,1或2,具体取决于我正在寻找的对象。
作为一个具体的例子:
对于大于3的对象,是否存在等于@“1”的键。
在这种情况下,我应该期待返回YES,因为在我进行拆分后,对象4的键等于@“1”。
我想我正在寻找一种聪明的方法来定义NSPredicate来对由分号分隔的键进行拆分,然后根据它进行过滤(比较等)。如果您有任何疑问或需要其他信息,请与我们联系。
答案 0 :(得分:2)
示例代码:
NSDictionary* dict = @{ @"10;0.75,0.75":@0,
@"0;2.25,2.25":@1,
@"1;3.5,2.0":@3,
@"1;4.5,3.0":@4,
@"2;6.0,5,0":@5};
__block NSString* foundKey = nil;
[dict enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSNumber* obj, BOOL *stop) {
//here goes condition
//get substr
NSArray* arr = [key componentsSeparatedByString:@";"];
int num = [[arr objectAtIndex:0]integerValue];
if ((num == 1)&&([obj integerValue]>3)) {
foundKey = key;
stop = YES;
}
}];
if (foundKey) {
NSLog(@"%@:%@",foundKey,[dict objectForKey:foundKey]);
}
答案 1 :(得分:2)
我能想到的一个非常天真的实现
- (BOOL)hasKey:(NSString *)key withValueGreaterThan:(id)object{
NSDictionary *dictionary = @{@"10;0.75,0.75": @0,
@"0;2.25,2.25" : @1,
@"1;3.5,2.0" : @3,
@"1;4.5,3.0" : @4,
@"2;6.0,5,0" : @5};
NSPredicate *keyPredicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH %@",key];
NSArray *filteredKeys = [[dictionary allKeys]filteredArrayUsingPredicate:keyPredicate];
for (NSString *k in filteredKeys) {
NSNumber *value = dictionary[k];
if (value>object) {
return YES;
}
}
return NO;
}
使用
BOOL hasValue = [self hasKey:@"1;" withValueGreaterThan:@3];
答案 2 :(得分:0)
只需使用以下方法:
-(BOOL)filterFromDictionary:(NSDictionary*)dict keyEqual:(NSString*)key greaterthanObj:(NSString*)obj
{
NSArray *allKeys = [dict allKeys];
for (NSString *eachkey in allKeys) {
NSString *trimmedKey = [self trimKeyuntill:@";" fromString:eachkey];
NSString *trimmedValue = [dict objectForKey:eachkey];
if ([trimmedKey isEqualToString:key] && [trimmedValue intValue] > [obj intValue]) {
return YES;
}
}
return NO;
}
使用您的字典调用上述方法,如:
NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1",@"1",@"3",@"4",@"5", nil] forKeys:[NSArray arrayWithObjects:@"10;0.75,0.75",@"0;2.25,2.25",@"1;3.5,2.0",@"1;4.5,3.0",@"2;6.0,5,0", nil]];
[self filterFromDictionary:dict keyEqual:@"1" greaterthanObj:@"3"]
我假设你的所有物品都是n绳子。否则改变 intValue