比较一个 NSString 大于或小于另一个 NSString

Comparing is one NSString greater or less then another NSString

我正在尝试了解比较 NSString 例程。请考虑以下代码:

// String

    NSString *str1 = @"This is a string A";

    NSString *str2 = @"This is a string B";

    NSString *res;

    NSComparisonResult compareResult;

compareResult = [str1 compare:str2];

    if (compareResult == NSOrderedAscending)
        NSLog(@"str1 < str2");

    if (compareResult == NSOrderedSame)
        NSLog(@"str1 == str2");
    else // must be NSOrderedDescending
        NSLog(@"str1 > str2");

我的第一个问题是,我们如何确定 NSString 大于或小于另一个?它不是一个数字,那么我们究竟如何确定它呢?

NSString 由 16 位大小的 Unichar 字符组成。也许编译器确定每个字符串的实际大小并进行比较?

我的第二个问题是:

满足所有条件。怎么会这样?字符串不同,我们得到了所有 3 种可能的结果 - str1 大于 str2,小于 str2,并且相等。

注意比较结果是按顺序排列的,不能大于也不能小于。不要把顺序等同于大于或小于。

约定顺序基于字母顺序。

虽然长度是字符串的一个特征,但它比 unicode 稍微复杂一些,因为单个字符可能需要多个 unicode 代码点。

此外 NSString 不是单字符字符串,但似乎是(实际实现是不透明的)序列或 UTF-16 代码点。

代码:

if (compareResult == NSOrderedAscending)
    NSLog(@"str1 < str2");

if (compareResult == NSOrderedSame)
    NSLog(@"str1 == str2");
else // must be NSOrderedDescending
    NSLog(@"str1 > str2");

有缺陷,应该是(注意else if):

if (compareResult == NSOrderedAscending)
    NSLog(@"str1 preceeds str2");
else if (compareResult == NSOrderedSame)
    NSLog(@"str1 is the same as str2");
else // must be NSOrderedDescending
    NSLog(@"str1 follows str2");

导致输出:

str1 preceeds str2

在cocoacompare:returns三个代码之一:

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending 
};
typedef NSInteger NSComparisonResult;

如你所见,它没有使用大于或小于,而是降序,升序和相同。

对于数字排序,它匹配 <、>、==,但在字符串中它匹配字母顺序。


比较字符串时请注意 compare:-alernatives

  • - caseInsensitiveCompare: @"ABC" 和@"abc" 被认为是相同的
  • - localizedCompare: 作为比较,但知道如何处理特定语言的字母表
  • - localizedCaseInsensitiveCompare: 合并前 2 个

这是一个非常复杂的问题,这里描述了一些细节:

http://unicode.org/reports/tr10/

一个例子:
string_1 由 ('b'、分音符、'a')
组成 string_2 由 ('b', 'ä')
组成 ('ä' 是带有分音符(两个点)的 'a')
两者都呈现为 'bä'
两个字符串都包含 2 个字形
string_1 包含 3 个代码点
string_2 包含 2 个代码点
在 UTF-16(原生 NSString 编码)中,string_1 的长度为 6 个字节,string_2 的长度为 4 个字节。它们的 NSString -length 是 3 和 2.

这意味着,你不应该认为两个字符串不同只是因为它们有不同的 length ;)

根据 NSString 比较规则,两个字符串相等。

[string_1 compare:string_2] 将 return NSOrderedSame
[string_1 isEqual:string_2] 将 return 是

...然后是case-insensitive-compare,然后是localization-aware-compare...