0

我设置了以下字典(对象,键)

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。

作为一个具体的例子:

是否存在任何等于 @"1" 且对象大于 3 的键。

在这种情况下,我应该期望返回 YES,因为在我进行拆分之后,对象 4 有一个等于 @"1" 的键。

我想我正在寻找一种聪明的方法来定义一个 NSPredicate 来对由分号分隔的键进行拆分,然后基于此进行过滤(比较等)。如果您有任何问题或需要更多信息,请告诉我。

4

3 回答 3

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]);
}
于 2013-06-14T07:01:26.443 回答
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];
于 2013-06-14T07:01:37.920 回答
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"]

我假设你所有的对象都是 nsstrings。否则更改intValue

于 2013-06-14T07:36:41.523 回答