【问题标题】:Predicate for range of NString in a Array数组中 NString 范围的谓词
【发布时间】:2014-06-30 21:49:44
【问题描述】:

假设我有一个数组(NSArray)

NSArray *cityArry = @[@"Chennai", @"Mumbai", @"Kolkata"];

例如,我提到了带有 3 个对象的 NSArray,但实际上在运行时我有一个包含 1000 多个对象的数组。

现在我有了字符串(NSString) "chennai Tnagar"

NSString *scanedStr = @"Chennai Tnagar";

所以,现在我想知道scanedStr的范围是否包含在cityArry中。例如,我应该从cityArry 得到@"Chennai" 的输出。

我知道我们可以通过循环NSArray 来做到这一点,通过使用rangeofstring 我们可以获得输出。由于我有超过 1000 个对象,我不想进行循环。请指导我并帮助我解决这个问题。

提前致谢

【问题讨论】:

  • 你的算法会匹配“Che”吗?
  • 不,我不想在“scannedstr”为“che.当 NSSting 'scannedstr' 类似于 'chennai sometext'、'sometext chennai' 等时,我想得到它。
  • 但是“Tnagar”呢? “Tnagar sometext”和“sometext Tnagar”也会匹配?

标签: ios objective-c nsstring nsarray nspredicate


【解决方案1】:

我确定这是另一个答案的副本,但我找不到。如果有人可以,请将此作为欺骗关闭。

无论如何,IN 运算符在字符串上工作得很好。显然它是无证的,所以你必须决定是否要依赖它:

NSArray *cityArray = @[@"Chennai",@"Mumbai",@"Kolkata"];

NSString *scannedStr = @"Chennai Tnagar";

NSPredicate *pred = [NSPredicate predicateWithFormat: @"SELF IN[cd] %@", scannedStr];

NSArray *result = [cityArray filteredArrayUsingPredicate: pred];

此解决方案的优点是将谓词的对象保留在左侧,我碰巧发现它更易于阅读 - 但如前所述,它没有记录。

如果您希望使用已记录的构造,可以交换谓词的顺序并使用普通的CONTAINS

pred = [NSPredicate predicateWithFormat: @"%@ CONTAINS[cd] SELF", scannedStr];

【讨论】:

  • 我确实发布了一个类似的答案 (stackoverflow.com/a/23594103/1187415),但后来我删除了它,因为这种行为没有记录在案,并且因为@insane-36 在他的回答 (stackoverflow.com/a/23594199/1187415) 中显示了对同一个问题这可以通过更简单的记录谓词来实现。
  • @Monolo 你的答案是完美的。但是你说它是无证的。可以用吗?
  • @PrashanthRajagopalan 实际上,我昨天被@MartinR 误入歧途了,它使用了优雅的IN。您可以只翻转谓词并使用格式字符串中记录的CONTAINS,如下所示:@"%@ CONTAINS[cd] SELF"。我会更新答案。
【解决方案2】:

您基本上可以拆分字符串并在 cityArry 上搜索数组。

NSString *scannedStr = @"Chennai Tnager";

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF in[cd] %@", [scannedStr componentsSeparatedByString:@" "]];

[cityArray filteredArrayUsingPredicate: predicate];

【讨论】:

  • 哇...非常感谢...它就像魔术一样工作 :) 但我担心,这是优化的方法吗?
  • 是的,谓词是Objective C中过滤集合的最佳方式。
  • @PrashanthRajagopalan:显式循环可以比谓词,比较stackoverflow.com/a/21158730/1187415
  • 请允许我为您的算法介绍一些扩展测试数据:cityArry = @[@"Chennai", @"New York"]scannedStr = @"New York City"。该算法是否产生预期的结果?
  • @MartinR 在家里!我几乎可以肯定,我的回答中的信息来自您对另一个问题的评论或回答。你有机会挖出来吗?我找不到它。
【解决方案3】:

我建议您使用 SQL 查询 like,将 sqlite3 用作您拥有的所有城市列表的数据库。实现数据库有点痛苦,但它解决了我认为的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多