2

我有一个 NSDictionaries 的 NSArray。我需要检查 NSArray 中 NSDictionary 的键是否至少出现一次对象。我通过使用来做到这一点

int i;
for (i=0;i< [myArray count];i++)
{
    if ([[[myArray objectAtIndex: i] objectForKey: myKey] isEqualToString: myString]) {
        found = YES;
        break;
    } else {
        found = NO;
    }
}

但我怀疑有更好/更快的替代方案......

谢谢

4

7 回答 7

7

是的。使用“快速枚举”,通常也称为for-in循环:

for (NSDictionary* dict in myArray) {

此外,要比较NSString's,请使用-isEqualToString:.

   if ([[dict objectForKey: myKey] isEqualToString:myString]) {

也就是说,对此没有算法改进(即这种方法已经是最好的了。)

于 2010-02-15T21:18:19.613 回答
6

这是您使用当前数据结构所能获得的最快速度。您正在对数组中的每个字典进行 O(1) 查找。如果您有大量字典,这可能会变得昂贵,因此您可以考虑(很大程度上取决于数据的语义)保留一个单独的后备 NSSet,其中包含包含字典中所有值的字符串对象集。然后您可以在该集合中检查一次是否存在。

告诉我们更多关于数据的形式以获得更多洞察力......

还要小心带有s的==运算符。NSString如果您实际上是在检查字符串的文本是否相等,则应-isEqualToString:改为使用,因为您的表单只会进行参考比较。

于 2010-02-15T21:17:09.893 回答
5

您应该使用快速枚举,它将在后台使用 C 数组遍历对象。现在,您在循环中每次都调用 -objectAtIndex: 和 -count。

如果 myKey 是字符串,您也可以查看 NSPredicate。我的直觉告诉我它会更慢,但你永远不知道它是否会受益于 NSDictionary 的内部优化:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ LIKE %@", myKey, myString];
BOOL found = ([[myArray filteredArrayUsingPredicate:predicate] count] > 0);
于 2010-02-16T22:05:12.757 回答
3

您可以使用键值编码更简洁:

[[myArray valueForKey:myKey] containsObject:myString];

它不一定更快(我怀疑它会更慢),但速度并不总是主要问题。速度在特定情况下是否至关重要是由分析来决定的。

于 2010-02-16T22:31:55.137 回答
2

用于==检查字符串相等性可能会导致意外行为,因为您实际上是在比较指针(如果您确定正在处理由两个指针指向的单个字符串对象,那可能没问题)。isEqualToString:可能是您想要的。

您可以使用“快速枚举”来稍微简化事情:

bool found = NO;

for (NSDictionary *dict in myArray) {
    found = [[dict objectForKey:myKey] isEqualToString:myString];

    if (found)
        break;
}

它只是“更快”,因为它写的字更少。执行速度是一样的。

于 2010-02-15T21:17:00.330 回答
1

收到您的对象后,您可以检查您收到的对象是“NSArray”或“NSDictionary”或“NSString”等。您可以使用以下代码来验证您的对象。

if([obj isKindOfClass:[NSArray class]]){
    NSLog(@"IS NSArray");
}
else if([obj isKindOfClass:[NSDictionary class]]){
    NSLog(@"Is NSDictionary");
}
else
{
    NSLog(@"Other");
}
于 2014-10-02T22:30:53.337 回答
0

快速枚举

BOOL found;

for (NSDictionary *dict in array) {

        if ([[dict objectForKey:@"YOURKEY"] isEqualToString:@"YOURVALUE"]) {
            found = YES;
            break;
        } else {
            found = NO;
        }
    }
于 2016-09-28T09:14:43.507 回答