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

时间:2015-05-08 18:41:30

标签: objective-c 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字符组成。也许编译器确定每个字符串的实际大小并进行比较?

我的第二个问题是: enter image description here

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

3 个答案:

答案 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:结合前两个
  • ...