iOS NSComparisonResult介紹

NSComparisonResult 是一個(gè)枚舉類型里面包含三個(gè)值

NSOrderedAscending = -1L,表示兩個(gè)比較的對(duì)象前者小于后置
NSOrderedSame, 表示比較的對(duì)象相等
NSOrderedDescending表示兩個(gè)比較的對(duì)象前者大于后者

這里用數(shù)組排序的方法來為大家介紹NSComparisonResult的用法,這里只對(duì)升序做講解,降序可以下載示例代碼或自己試著寫一下

NSArray: - (NSArray<ObjectType> *)sortedArrayUsingComparator:(NSComparator NS_NOESCAPE)cmptr
NSMutableArray: - (void)sortUsingComparator:(NSComparator NS_NOESCAPE)cmptr

1.首先展示幾個(gè)簡(jiǎn)單的例子

    NSArray *array = @[@1,@8,@4,@5,@2,@3];
    NSMutableArray *mutableArray1 = [NSMutableArray arrayWithArray:array];
    NSMutableArray *mutableArray2 = [NSMutableArray arrayWithArray:array];
    NSMutableArray *mutableArray3 = [NSMutableArray arrayWithArray:array];
    NSArray *stringArray = @[@"name",@"age",@"sex",@"height",@"weight",@"namy"];
    NSArray *mixArray = @[@"name",@8,@1,@"age",@"sex",@5,@"height",@"2",@"3"];
    NSArray *numArray = @[@"1",@"8",@"4",@"5",@"2",@"3"];

    NSArray *mixArray1 = [mixArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return NSOrderedAscending;
    }];
    
    NSArray *numArray1 = [numArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return NSOrderedAscending;
    }];
    
    NSLog(@"mixArray1%@--numArray1%@",mixArray1,numArray1);
    
    NSArray *sourtArray1 = [stringArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        //        將數(shù)組中的字符串升序排列
        return NSOrderedAscending;
    }];
    
    NSLog(@"sourArray1%@",sourtArray1);
    
    [mutableArray1 sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        //        將數(shù)組中的對(duì)象升序排列
        return NSOrderedAscending;
    }];
    
    NSLog(@"mutableArray1%@",mutableArray1);

從下面的打印結(jié)果可以看出,當(dāng)返回值至為NSOrderedAscending,NSOrderedSame數(shù)組保持原排序不變,當(dāng)返回值為NSOrderedDescending時(shí)將對(duì)數(shù)組中被比較的兩個(gè)對(duì)象的位置進(jìn)行交換也就是交換數(shù)組對(duì)象的index,具體內(nèi)部的排序算法實(shí)現(xiàn)我也不清楚,我猜是用歸并算法。不過這也不重要,我們只需要知道當(dāng)返回值為NSOrderedDescending時(shí),obj2的位置就會(huì)移動(dòng)到obj1前面,當(dāng)返回值為NSOrderedAscending,NSOrderedSame時(shí)二者的相對(duì)位置保持不變

2017-09-05 13:22:55.340 MYComparisonResultExample[5688:118789] mixArray1(
    3,
    2,
    height,
    5,
    sex,
    age,
    1,
    8,
    name
)--numArray1(
    3,
    2,
    5,
    4,
    8,
    1
)
2017-09-05 13:22:55.340 MYComparisonResultExample[5688:118789] sourArray1(
    name,
    age,
    sex,
    height,
    weight,
    namy
)
2017-09-05 13:22:55.340 MYComparisonResultExample[5688:118789] mutableArray1(
    1,
    8,
    4,
    5,
    2,
    3
)

2.那么我們可以認(rèn)為數(shù)組的排序方法sortUsingComparator 、sortedArrayUsingComparator的參數(shù)是一個(gè)block,根據(jù)block中的返回值對(duì)數(shù)組中的對(duì)象的index進(jìn)行排序,而我們也可以手動(dòng)控制,當(dāng)返回值為NSOrderedDescending時(shí),將會(huì)按index對(duì)其進(jìn)行逆向排序,當(dāng)返回值為NSOrderedAscending則維持原順序不變,所以我們可以手動(dòng)控制,讓其升序排列還是降序排列,我們用下面的方法做一下驗(yàn)證

//    2.根據(jù)compare返回的結(jié)果,進(jìn)行排序。如果返回的是NSOrderedAscending、NSOrderedSame則保持不變否則交換二者的位置,這其實(shí)是一種人為控制
    NSArray *sourtArray2 = [stringArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        //        將數(shù)組中的字符串升序排列
        return [obj1 compare:obj2];
    }];
    
    NSLog(@"sourArray2%@",sourtArray2);
    
    [mutableArray2 sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        //        將數(shù)組中的對(duì)象升序排列
        return [obj1 compare:obj2];
    }];
    
    NSLog(@"mutableArray2%@",mutableArray2);

打印結(jié)果為

2017-09-05 15:10:39.188 MYComparisonResultExample[8065:171748] sourArray2(
    Weight,
    age,
    height,
    name,
    namy,
    sex,
    weight
)
2017-09-05 15:10:39.188 MYComparisonResultExample[8065:171748] mutableArray2(
    1,
    2,
    3,
    4,
    5,
    8
)

這里要先說一下compare方法,compare是對(duì)oc中的一些對(duì)象做比較的方法,根據(jù)返回值NSComparisonResult判斷比較對(duì)象的大小。這里我們主要會(huì)用到NSNumer和NSString。NSNumber可以理解,就是直接比較其對(duì)應(yīng)值的大小。而NSString則是對(duì)字符串中的字符,根據(jù)其ASCII碼逐個(gè)進(jìn)行比較


可以使用compare方法的對(duì)象.png

當(dāng)比較的對(duì)象為NSString類型時(shí),我們還可以為其增加附加條件,比如區(qū)分大小寫,不區(qū)分大小寫等等,可以通過選擇NSStringCompareOptions的枚舉類型或相應(yīng)的方法進(jìn)行實(shí)現(xiàn),這里就不做贅述

  • (NSComparisonResult)compare:(NSString *)string;
  • (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
  • (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare;
  • (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare locale:(nullable id)locale;
  • (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;
  • (NSComparisonResult)localizedCompare:(NSString *)string;
  • (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string;

也就是說 return [obj1 compare:obj2] 是利用了compare返回值的特性,對(duì)數(shù)組內(nèi)容進(jìn)行了排列,你可以試試改為return [obj2 compare:obj1]之后打印的結(jié)果

3.如果對(duì)于2中的代碼還是不太明白,我們可以看看下面的代碼,可以更直觀的看出利用compare的效果

//    3.原理與2相同,只不過展示的方式更直觀,2中只不過是利用compare的返回值,精簡(jiǎn)出來的寫法。
    NSArray *sourtArray3 = [stringArray sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        //        將數(shù)組中的字符串升序排列
        if ([obj1 compare:obj2] == NSOrderedAscending) {
            return NSOrderedAscending;
        }else {
            return NSOrderedDescending;
        }
    }];
    
    NSLog(@"sourArray3%@",sourtArray3);
    
    [mutableArray3 sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        //        將數(shù)組中的對(duì)象升序排列
        if ([obj1 integerValue] > [obj2 integerValue]) {
            return NSOrderedDescending;
        }else {
            return NSOrderedAscending;
        }
    }];

    NSLog(@"mutableArray3%@",mutableArray3);
    

打印結(jié)果

2017-09-05 15:10:39.188 MYComparisonResultExample[8065:171748] sourArray3(
    Weight,
    age,
    height,
    name,
    namy,
    sex,
    weight
)
2017-09-05 15:10:39.188 MYComparisonResultExample[8065:171748] mutableArray3(
    1,
    2,
    3,
    4,
    5,
    8
)

試試將[obj1 compare:obj2] == NSOrderedAscending 改為[obj1 compare:obj2] == NSOrderedDescending,打印出來會(huì)有什么變化。附上示例代碼github NSComparisonResult。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 面向?qū)ο笕笾е庋b:就是把相關(guān)的數(shù)據(jù)和代碼結(jié)合成一個(gè)有機(jī)的整體,形成數(shù)據(jù)和操作代碼的封裝體,對(duì)外只提供一個(gè)可以控...
    WangDavid閱讀 1,960評(píng)論 0 2
  • 數(shù)組可對(duì)其中包含的元素進(jìn)行排序。 在排序前,我們需要定義一個(gè)Model類,將Model類對(duì)象添加至數(shù)組中。 定義一...
    SkyMing一C閱讀 11,066評(píng)論 0 15
  • //將NSData轉(zhuǎn)化為NSString NSString* str = [[NSString alloc] in...
    脫脫夫斯基閱讀 1,243評(píng)論 0 52
  • NSArray: indexOfObjectIdenticalTo:針對(duì)的對(duì)象地址,當(dāng)對(duì)象是字符串或者數(shù)值時(shí),不能...
    草原烈鷹閱讀 3,924評(píng)論 0 2
  • //將NSData轉(zhuǎn)化為NSString NSString* str = [[NSString alloc]...
    吾是小馬哥閱讀 2,594評(píng)論 0 3

友情鏈接更多精彩內(nèi)容