gpt4 book ai didi

iphone - Objective-C - 比 NSCaseInsensitiveSearch 更好的搜索?关键词? NSPredicate?

转载 作者:行者123 更新时间:2023-11-29 10:56:30 27 4
gpt4 key购买 nike

目前我正在使用它来搜索我的词典数组(来自 plist 文件):

for(NSDictionary *wine in mainArray)
{
NSString *wineName = [wine objectForKey:@"name"];
NSRange range = [wineName rangeOfString:searchText options:NSCaseInsensitiveSearch];
if(range.location != NSNotFound)
[searchArray addObject:wine];
}

在这个问题中,我将以这个 plist 为例:

<array>
<dict>
<key>name</key>
<string>Banana One (Yellow)</string>
<key>value</key>
<string>1</string>
</dict>
<dict>
<key>name</key>
<string>Apple Two (White)</string>
<key>value</key>
<string>2</string>
</dict>
<dict>
<key>name</key>
<string>Pineapple Three (Orange)</string>
<key>value</key>
<string>3</string>
</dict>
<dict>
</array>

(不关心值)

好的,当我将 UISearchBar 与 NSCaseInsensitiveSearch 一起使用时,我可以简单地搜索数组 (ObjectForKey=@"name") 而无需考虑大小写。好的!

例如,我可以搜索:@"banana" 并找到:Banana One(黄色)

我可以搜索:@"two" 并找到:Apple Two (White)

我可以搜索:@"banana one"并找到:Banana One(黄色)

我还可以搜索:@"Orange" 并找到:菠萝三号(橙色)

但前提是搜索顺序正确

我无法搜索:@"One Banana"@"Yellow One"@"Yellow Banana"我真的很想能够像这样搜索,也许使用关键字?

也许是这样的?:

for(NSDictionary *wine in mainArray)
{
NSArray *myArray = [searchText componentsSeparatedByString:@" "];
NSString *wineName = [wine objectForKey:@"name"];
NSRange range = [wineName rangeOfString:myArray options:NSCaseInsensitiveSearch];
if(range.location != NSNotFound)
[searchArray addObject:wine];
}

我知道这确实行不通,但我想您明白我的意思吗?那么,如何能够搜索例如:@"one banana" 并找到:Banana One (Yellow)

最佳答案

我使用 NSPredicate 制定了以下解决方案.

    NSArray *objects = @[@"Banana One",@"Apple Two"];
NSString *searchString = @"one banana";
NSArray *searchComoponents = [searchString componentsSeparatedByString:@" "];

NSMutableString *format = [NSMutableString stringWithFormat:@"SELF CONTAINS[c] \"%@\"",[NSString stringWithFormat:@"%@",searchComoponents[0]]];
for (int i = 1; i < searchComoponents.count; i++) {
[format appendFormat:@" AND SELF CONTAINS[c] \"%@\"",[NSString stringWithFormat:@"%@",searchComoponents[i]]];
}
NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@",format]];
NSArray *filtered = [objects filteredArrayUsingPredicate:predicate];

简单说明一下:SELF是数组中的当前对象,要证明,CONTAINS看,左边的对象是否包含右边的对象,[c] 使它不区分大小写。因此,对于 searchString 中的每个关键字,您都将条件添加到 predicateformat 中,因此最后,您应该有一个格式如下的 NSPredicate:自包含[c] object1 和自包含[c] object2 ....最后一行使用这个 NSPredicate 创建了一个过滤数组。有关 predicateFormat 的更多信息,请查看 here .

关于iphone - Objective-C - 比 NSCaseInsensitiveSearch 更好的搜索?关键词? NSPredicate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18057256/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com