比较一个 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...
我正在尝试了解比较 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...