我试图理解比较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,等于。
答案 0 :(得分:3)
注意比较结果的顺序,不大于或小于。不要将订单等同于大于或小于。
按惯例排序基于字母顺序。
虽然length是字符串的特征,但它比unicode稍微复杂一些,因为单个字符可能需要多个unicode代码点。
同样NSString
不是一串unichars,但似乎是(实际的实现是不透明的)序列或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优先于str2
答案 1 :(得分:3)
这是一个非常复杂的问题,这里描述了一些细节:
http://unicode.org/reports/tr10/
一个例子:
string_1由('b',DIAERESIS,'a')组成
string_2由('b','ä')组成
('ä'是带有DIAERESIS(两个点)的'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]将返回NSOrderedSame
[string_1 isEqual:string_2]将返回YES
...然后有不区分大小写的比较,然后有本地化感知比较...
答案 2 :(得分:2)
在cocoa compare:
中返回三个代码之一:
enum {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
如你所见,它不会使用更多或更少,但是降序,升序和相同。
用于对匹配的数字进行排序&lt;,&gt;,==,但在字符串中,它按字母顺序排列。
比较字符串时要注意compare:
- alernatives
- caseInsensitiveCompare:
@“ABC”和@“abc”被视为相同- localizedCompare:
作为比较,但知道如何处理特定于语言的字母- localizedCaseInsensitiveCompare:
结合前两个