• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - NSPredicate SELF CONTAINS[c] 首先返回包含在较长文本中的值

[复制链接]
菜鸟教程小白 发表于 2022-12-12 09:58:24 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 UISearchBar 对 UITableView 进行排序。表格中填充的数组中的每个值最多可以包含 3 个单词

@“菠萝”,@“菠萝绿”,@“苹果绿”,@“苹果绿,生”...

我在下面使用 NSPredicate 方法:

 NSArray *words = [text componentsSeparatedByString" "];
    NSMutableArray *predicateList = [NSMutableArray array];
    for (NSString *word in words) {
        if ([word length] > 0) {
            NSPredicate *pred = [NSPredicate predicateWithFormat"SELF contains[c] %@", word];
            [predicateList addObject:pred];
        }
    }
    NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicateList];
    NSLog(@"%@", predicate);

它可以工作,但它不会按最近的相对值对值进行排序,而是始终按其索引从数组中获取第一个匹配值。这意味着,如果我想找到“apple”并在 SearchBar 中输入它,结果将是:

Pineapple
Pineapple Green
Apple
Apple Green

我不能使用谓词BEGINSWITH,因为如果我搜索“青苹果”,结果将是空白的。在这种特殊情况下,我可以使用升序对结果进行排序,但在另一种情况下,例如 TEA,它将不起作用,因为字符串“TEA”包含在其他单词中,例如 STEAM,并且会排在第一位。

我这里没有选项,有没有办法根据搜索得到逻辑结果输出?如果要查找“Apple”:

Apple    
Apple Green

//-------添加

感谢您的回复。我正在考虑自定义逻辑并想出了这个。我确信它是脏代码并且可以改进,但现在它的性能要好得多。它仍然没有以有组织的方式显示结果,但是搜索现在包含所有相关的项目,无论您以什么顺序输入搜索:

NSArray *words = [text componentsSeparatedByString" "];

    NSString *word1;
    NSString *word2;
    NSString *word3;
    NSPredicate *predicate;

    if (words.count == 1) {
        word1 = [NSString stringWithFormat"%@", [words objectAtIndex:0]];
        predicate = [NSPredicate predicateWithFormat"SELF CONTAINS[cd] %@ OR SELF LIKE[cd] %@", word1, word1];
    }
    else if (words.count == 2) {
        word1 = [NSString stringWithFormat"%@", [words objectAtIndex:0]];
        word2 = [NSString stringWithFormat"%@", [words objectAtIndex:1]];
        predicate = [NSPredicate predicateWithFormat"SELF CONTAINS[cd] %@ AND SELF CONTAINS[cd] %@", word1, word2];
    }
    else if (words.count == 3) {
        word1 = [NSString stringWithFormat"%@", [words objectAtIndex:0]];
        word2 = [NSString stringWithFormat"%@", [words objectAtIndex:1]];
        word3 = [NSString stringWithFormat:@"%@", [words objectAtIndex:2]];
        predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@ AND SELF CONTAINS[cd] %@ AND SELF CONTAINS[cd] %@", word1, word2,word3];
    }
    NSArray *sortedArray = [self.allItemsArray filteredArrayUsingPredicate:predicate];
    filteredTableData = [sortedArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare];

如果有人知道如何对结果进行排序以获得最接近的匹配,请分享。谢谢



Best Answer-推荐答案


解决此问题的一种方法是将谓词应用于 NSSet 而不是 NSArray。像这样的:

     NSSet *tempSet = [NSSet setWithArray:words];
     tempSet = [tempSet filteredSetUsingPredicate:predicate];
     resultsArray = [tempSet allObjects];

希望这会有所帮助。

关于ios - NSPredicate SELF CONTAINS[c] 首先返回包含在较长文本中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383044/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap