2011-06-02 87 views
3

我有一個字典的鍵是NSStrings和其對象是NSArray。這裏有一個例子:什麼是生成此字符串的最佳方式? (NSMutableString ...)

key (NSString) : GroupA 
value (NSArray): John 
       Alex 
       Joe 
       Bob 

有很多這樣的條目,這只是一個例子。我需要做的是產生這樣的字符串(例如:

(GroupA contains[cd] ('John' OR 'Alex' OR 'Joe' OR 'Bob')) AND (GroupB contains[cd] ('Starcraft' OR 'WOW' OR 'Warcraft' OR 'Diablo')) AND ..... 

我將這個字符串被饋送到NSPredicate什麼是產生這個字符串的最佳方式,我可以使用循環和if?而這一切,但有一個更優雅的方式? 感謝。

回答

5

,這不是一個有效的謂詞格式字符串,這樣即使你最終生成它,您將無法將其轉換爲NSPredicate

這裏有你想要的東西,而不是:

NSDictionary *groupValuePairs = ....; 

NSMutableArray *subpredicates = [NSMutableArray array]; 
for (NSString *group in groupValuePairs) { 
    NSArray *values = [groupValuePairs objectForKey:group]; 
    NSPredicate *p = [NSPredicate predicateWithFormat:@"%K IN %@", group, values]; 
    [subpredicates addObject:p]; 
} 

NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 

這不具有區分和音調符號不敏感,你原來是暗示。如果你真的需要這個,那麼你將需要更復雜一點:

NSDictionary *groupValuePairs = ....; 

NSMutableArray *subpredicates = [NSMutableArray array]; 
for (NSString *group in groupValuePairs) { 
    NSArray *values = [groupValuePairs objectForKey:group]; 
    NSMutableArray *groupSubpredicates = [NSMutableArray array]; 
    for (NSString *value in values) { 
     NSPredicate *p = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", group, value]; 
     [groupSubpredicates addObject:p]; 
    } 
    NSPredicate *p = [NSCompoundPredicate orPredicateWithSubpredicates:groupSubpredicates]; 
    [subpredicates addObject:p]; 
} 

NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 
+0

Wow ....有必要了解更多關於NSPredicate的...感謝! – user635064 2011-06-04 10:41:56

1

應該是這樣的

NSDictionary *myDict = [NSDictionary dictionaryWithObject:[NSArray arrayWithObjects:@"John",@"Alex",@"Joe",@"Bob",nil] forKey:@"GroupA"]; 
NSString *myString = @"("; 

int j = 0; 
for(NSString *key in [myDict allKeys]) { 
    NSString *value = [myDict valueForKey:key]; 
    myString = [myString stringByAppendingFormat:@"%@ contains[cd] (", key]; 
    NSArray *myArray = (NSArray *)value; 

    int idx = 0; 
    for(NSString *name in myArray) { 
     myString = [myString stringByAppendingFormat:@"'%@'",name]; 
     if(idx < [myArray count] - 1) { 
      myString = [myString stringByAppendingFormat:@" OR "]; 
     } 
     idx++; 
    } 

    myString = [myString stringByAppendingString:@")"]; 

    if(j < [myDict count] -1) { 
     myString = [myString stringByAppendingString:@" AND "]; 
    } 

    j++; 

}; 

myString = [myString stringByAppendingString:@")"]; 

NSLog(@"mystring %@",myString); 
+2

如果'name'包含一個撇號,奧哈拉? – 2011-06-02 21:59:29

+0

這就是「PHP方式」... – 2011-06-02 22:00:17

+0

真的嗎?那麼,爲什麼只是在沒有提供你自己的答案的情況下降低我的答案? #trollin – brandontreb 2011-06-02 22:02:23

相關問題