Objective—C中的排序及Compare陷阱

來源:互聯網
上載者:User

標籤:排序   compare   

campare陷阱

NSString有多個compare相關方法:
- (NSComparisonResult)compare:(NSString *)string;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(id)locale;

NSComparisonResult 是定義的一個枚舉,定義如下:
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
其中,NSOrderedSame 表示比較的兩個字串完全一致, 同時,在這個枚舉中,它的值是 0.
字串比較在程式中很常見,比如:
    if ([str1 compare:@"some text"] == NSOrderedSame) {
        // TODO
    }
    else {
        // TODO
    }
但是,如果如上中的str1為nil,根據Objective-C的訊息調用規則(方法調用),對nil發送的任何訊息,得到的返回都是nil。這樣的情況下,運行時是不會像C/C++那樣,出現null 指標的非法訪問而使得程式強行終止。也就是說,在Objective-C下面,即便str1為nil,也不會造成程式崩潰,而是會繼續運行。
那麼當str1為空白的時候,[str1 compare:@"some text"] 訊息的返回就會為nil。nil表示一個空的Objective-C對象,實際就是表示一個null 指標,而它代表的值就是0,與NSOrderedSame的值相等. 如此,回到最前面的if語句,如果str1為nil,那麼整個語句的值為真。這會給程式造成非常嚴重的問題,小則邏輯錯誤,UI顯示錯誤等,大則會造成資料泄漏等等。。。所以,一旦出現這種情況,還是很嚴重的。
筆者個人建議,以上代碼至少應該寫為:
    if (str1!=nil && [str1 compare:@"some text"] == NSOrderedSame) {
        // TODO 

   }

    else {
        // TODO
    }


OC排序代碼,直接上代碼

//數字排序

- (void)sortNumber{

    NSArray *originalArray = @[@"8",@"41",@"32",@"11",@"-1"];

    

    //block比較方法,數組中可以是NSInteger,CGFloat等(需要轉換)

    NSComparator finderSort = ^(id string1,id string2){

        if ([string1 integerValue] > [string2integerValue]) {

            return (NSComparisonResult)NSOrderedDescending;

        }else if ([string1integerValue] < [string2integerValue]){

            return (NSComparisonResult)NSOrderedAscending;

        }

        else

            return (NSComparisonResult)NSOrderedSame;

    };

    

    NSArray *resultArray = [originalArray sortedArrayUsingComparator:finderSort];

    NSLog(@"排序結果:%@",resultArray);

}


//字串排序

- (void)sortString{

    

    //  2. 非數字型字串(注意用compare比較要剔除空資料(nil))

    NSArray *charArray =@[@"string 1",@"String 21",@"string 12",@"String 11",@"String 02"];

    NSStringCompareOptions comparisonOptions =NSCaseInsensitiveSearch|NSNumericSearch|

    NSWidthInsensitiveSearch|NSForcedOrderingSearch;

    NSComparator sort = ^(NSString *obj1,NSString *obj2){

        NSRange range = NSMakeRange(0,obj1.length);

        return [obj1 compare:obj2options:comparisonOptionsrange:range];

    };

    NSArray *resultArray2 = [charArray sortedArrayUsingComparator:sort];

    NSLog(@"字串排序%@",resultArray2);

}


//字典排序

- (void)sortDicrionary{

    NSMutableArray *array = [NSMutableArrayarrayWithObjects:

                              @{@"obj0":@"0"},

                              @{@"obj3":@"3"},

                              @{@"obj1":@"1"},

                              @{@"obj2":@"2"},

                              @{@"obj4":@"4"},

                              nil];

    NSArray *resultArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {

        NSNumber *number1 = [[obj1 allKeys] objectAtIndex:0];

        NSNumber *number2 = [[obj2 allKeys] objectAtIndex:0];

        NSComparisonResult result = [number1compare:number2];

        

        //return result == NSOrderedAscending;  //降序

        return result == NSOrderedDescending;//升序

    }];

    NSLog(@"OrderedDescending:%@", resultArray);

}


//自訂對象排序

- (void)sortCustomObject{

    SLPerson *person1 = [[SLPersonalloc]init];

    [person1 setName:@"ABCD"];

    [person1 setAge:24];


    SLPerson *person2 = [[SLPersonalloc]init];

    [person2 setName:@"ACBD"];

    [person2 setAge:22];

    

    SLPerson *person3 = [[SLPersonalloc]init];

    [person3 setName:@"ABDC"];

    [person3 setAge:33];

    

    SLPerson *person4 = [[SLPersonalloc]init];

    [person4 setName:@"ACDB"];

    [person4 setAge:22];

    

    NSMutableArray *array = [NSMutableArrayarrayWithObjects:person1, person3, person4, person2,nil];

    NSSortDescriptor *sortDescriptor1 = [NSSortDescriptorsortDescriptorWithKey:@"age"ascending:YES]; //先按照age排序,

    NSSortDescriptor *sortDescriptor2 = [NSSortDescriptorsortDescriptorWithKey:@"name"ascending:YES]; //如果age相同,按照name排序,以此類推

    

    NSArray *tempArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]];

    

    for(NSInteger i =0; i < [tempArraycount]; i++){

        NSLog(@"%@--------%d\n", [[tempArrayobjectAtIndex:i]name], [[tempArrayobjectAtIndex:i]age]);

    }

}


代碼連結:http://download.csdn.net/detail/u011883764/7827311


Objective—C中的排序及Compare陷阱

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.