【问题标题】:Search from NSArray using Predicate使用 Predicate 从 NSArray 中搜索
【发布时间】:2014-09-09 07:37:01
【问题描述】:

我当前的数组如下所示。我为 sectionIndex 表创建了这个数组格式。所以我可以从数组中搜索并使用索引表显示搜索文本。

arrContent = (
    {
    key = A;
    value =         (
        Ac,
        Acting
    );
},
    {
    key = B;
    value =         (
        Basketball,
        Baseball
    );
},
    {
    key = C;
    value =         (
        Cat
    );
}
    {
    key = P;
    value =         (
        Panda,
        Peacock
    );
}
)

我的搜索代码如下所示。它工作正常。

-(void)searchText:(NSString *) text
{
[arrSearch removeAllObjects];
for (int i = 0; i < [arrContent count]; i++)
{
    NSMutableArray *temp = [[NSMutableArray alloc]init];
    NSMutableArray *arrFind = arrContent[i][@"value"];
    for (int j = 0; j < [arrFind count]; j++)
    {
        NSString *str = arrFind[j];
        // containsString: method find my string if its available within range
        if ([str containsString:text])
            [temp addObject:str];
    }

    if ([temp count])
    {
        [arrSearch addObject:@{@"key":arrContent[i][@"key"],@"value":temp}];
    }
}
NSLog(@"Search : %@",text);
NSLog(@"arrSearch : %@",arrSearch);
}

我得到如下输出。这是正确的。

Search : ac
arrSearch : (
    {
    key = A;
    value =         (
        Ac,
        Acting
    );
},
    {
    key = P;
    value =         (
        Peacock
    );
}
)

我只是想问是否有更好的方法来搜索并使用 NSPredicate 获得相同的输出,因为当有大量数据时,for 循环会花费时间。

希望得到帮助。

【问题讨论】:

    标签: ios iphone nsarray nspredicate


    【解决方案1】:

    你可以像这样使用 NSArray 的内置函数...

    - (NSArray *)filterArrayUsingText:(NSString *)text
    {
        NSMutableArray *filteredWordArray = [NSMutableArray array];
    
        for (NSDictionary *dictionary in yourWordArray) {
            NSArray *filteredWords = [self filterWordsFromArray:dictionary[@"value"] usingText:text];
    
            if (filteredWords) {
                [filteredWordArray addObject:@{@"key":dictionary[@"key"], @"value", filteredWords}];
            }
        }
    
        return filteredWordArray;
    }
    
    - (NSArray *)filterWordsFromArray:(NSArray *)wordArray usingText:(NSString *)text
    {
        NSPredicate *predicate = [NSPredicate predicateWithBlock:^(NSString *theWord, NSDictionary *bindings) {
            return [theWord containsString:text];
        }];
    
        NSArray *filteredArray = [wordArray filteredArrayUsingPredicate:predicate];
    
        return filteredArray.count == 0 ? nil : filteredArray;
    }
    

    另外,请确保使用现代 Obj-C 语法。

    此外,数据的存储方式也有些混乱。对于键/值对,您不存储 KeyValue

    你会这样存储...

    {
        A: (Ac,
            Acting),
        B: (Basketball,
            Baseball),
        C: (Cat),
        P: (Panda,
            Peacock)
    }
    

    【讨论】:

    • 不,如果我搜索“Ac”,那么我只想要值数组中包含“ac”的文本。
    • @Chinttu-RoxeN-Ramani 已编辑。再说一遍。使用更新的语法并确保您的数据正确存储。目前还没有。
    • 你能告诉我如何按升序对所有这些键进行排序,因为我必须使用部分在表中显示这些所有数据。像 Section = "A" 和 row 是数组索引。也许我必须对键进行排序,然后在数组中添加对象。对吗?
    • @Chinttu-RoxeN-Ramani 我会使用带块的排序描述符并轻松快速地返回[obj1[@"key"] compare:objj2[@"key"]];:D 如果它回答了您的问题,请记住接受:D
    • 非常感谢您的帮助,感谢好友 :)
    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2014-12-27
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多