【问题标题】:objective-c nscomparisonresult works wrongly?objective-c nscomparisonresult 工作错误?
【发布时间】:2014-05-18 10:18:29
【问题描述】:

它在某种程度上不适用于斯堪的纳维亚字母。

当我输入@“å”时,有两个字符串“夹在”那个搜索词; 一个字符串以低于“å”的“ø”开头,另一个以“å”开头的字符串。但是,即使我一遍又一遍地使用相同的搜索字符串,即@“å”,此比较代码有时会返回正确的结果,有时会返回错误的结果。有什么我忽略的吗?

编辑:抱歉,它应该是两个不同的 compStrings(如我的代码中所示),我忘记将数字 2 作为后缀。

compString2 表示以å 开头的第二个字符串。 compString 是以 ø 开头的那个。

我需要将搜索字符串与两个字符串进行比较,以确定它是否在这两个字符串之间。

让我用一种更好的方式来表述它,对于那些不知道斯堪的纳维亚字母的人来说,å 就像 c,ø 就像 b,如果搜索字符串是 c,那么它必须在 b 和 c 之间,对吧?

这是我的代码:

NSString *compString = [array objectAtIndex:i]; //i is an incremental number from a for-loop

//norwegian language
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"no_NO"];


if([searchString compare:compString2
                 options:(NSCaseInsensitiveSearch | NSAnchoredSearch)
                   range:range
                  locale:locale] == (NSOrderedAscending | NSOrderedSame)) {

    if([searchString compare:compString
                     options:(NSCaseInsensitiveSearch | NSAnchoredSearch) 
                       range:range
                      locale:locale] == NSOrderedDescending) {

        NSLog(@"found");

    }
}

最终编辑:

我发现了问题。解决方案很简单。永远不要做我写的按位或运算符“|”或普通的 OR 运算符“||”。

if([searchString compare:compString
options: NSCaseInsensitiveSearch 
range:range locale:locale] == NSOrderedAscending ||
 [searchString
 compare:compString
 options: NSCaseInsensitiveSearch 
range:range locale:locale] == NSOrderedSame)

意思是searchString

if([searchString
   compare:compString
   options: NSCaseInsensitiveSearch
    range:range locale:locale] == NSOrderedDescending)

意思是searchString > compString

【问题讨论】:

  • 你想达到什么目的?为什么一个 if 在另一个里面?
  • @Wain 嗨,我已经更新了我的问题。

标签: objective-c string comparison string-comparison


【解决方案1】:

我认为您不应该在第一次比较结果评估中使用 NSOrderedAscendingNSOrderedSame 作为位字段的位,因为您没有得到您可能想要的逻辑 (!) OR

在你的第一个 if () 中尝试这个:

if([searchString compare:compString2
                 options:(NSCaseInsensitiveSearch | NSAnchoredSearch)
                   range:range
                  locale:locale] != NSOrderedDescending) {

    /* ... */

}

【讨论】:

  • 我也试过这个,但结果相同。有时匹配,有时不匹配。我总是使用相同的比较字符串和搜索字符串,令人难以置信的是它给出了不同的结果。也许它与 iOS7 或 Xcode 5.1 有关?也许 nslocale 并不总是占主导地位?
  • range 变量呢?此外,documentation 解释说,options 应该是“使用 C 位或运算符的以下任何一个:NSCaseInsensitiveSearchNSLiteralSearchNSNumericSearch”。换句话说,它没有明确提到NSAnchoredSearch。能否请您发布可以编译和运行的代码?
  • 您的意思是我应该将 nil 作为参数“范围”的参数吗?我知道这一点,奇怪的是它用 NSAnchoredSearch 搜索得更好。现在我已将其删除,但结果仍然相同。代码很长......它在对象搜索栏的 textDidChange-method 内。我只有一个带有一个搜索栏的 TableView。
  • 不,我不建议你给nil作为参数range!您的代码很可能很长。为了定位错误,您应该提供this。此外,必须尝试使用​​断点和调试器或NSLogs 来检查您的算法,以确认确实是比较不起作用?
  • 是的,我确认只有比较才是问题所在。不过,不知道有没有其他的比较方式?
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2012-11-20
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多