NSComparisonResult 是一個枚舉類型里面包含三個值
NSOrderedAscending = -1L,表示兩個比較的對象前者小于后置
NSOrderedSame, 表示比較的對象相等
NSOrderedDescending表示兩個比較的對象前者大于后者
這里用數組排序的方法來為大家介紹NSComparisonResult的用法,這里只對升序做講解,降序可以下載示例代碼或自己試著寫一下
NSArray: - (NSArray<ObjectType> *)sortedArrayUsingComparator:(NSComparator NS_NOESCAPE)cmptr
NSMutableArray: - (void)sortUsingComparator:(NSComparator NS_NOESCAPE)cmptr
1.首先展示幾個簡單的例子
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) {
// 將數組中的字符串升序排列
return NSOrderedAscending;
}];
NSLog(@"sourArray1%@",sourtArray1);
[mutableArray1 sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
// 將數組中的對象升序排列
return NSOrderedAscending;
}];
NSLog(@"mutableArray1%@",mutableArray1);
從下面的打印結果可以看出,當返回值至為NSOrderedAscending,NSOrderedSame數組保持原排序不變,當返回值為NSOrderedDescending時將對數組中被比較的兩個對象的位置進行交換也就是交換數組對象的index,具體內部的排序算法實現我也不清楚,我猜是用歸并算法。不過這也不重要,我們只需要知道當返回值為NSOrderedDescending時,obj2的位置就會移動到obj1前面,當返回值為NSOrderedAscending,NSOrderedSame時二者的相對位置保持不變
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.那么我們可以認為數組的排序方法sortUsingComparator 、sortedArrayUsingComparator的參數是一個block,根據block中的返回值對數組中的對象的index進行排序,而我們也可以手動控制,當返回值為NSOrderedDescending時,將會按index對其進行逆向排序,當返回值為NSOrderedAscending則維持原順序不變,所以我們可以手動控制,讓其升序排列還是降序排列,我們用下面的方法做一下驗證
// 2.根據compare返回的結果,進行排序。如果返回的是NSOrderedAscending、NSOrderedSame則保持不變否則交換二者的位置,這其實是一種人為控制
NSArray *sourtArray2 = [stringArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
// 將數組中的字符串升序排列
return [obj1 compare:obj2];
}];
NSLog(@"sourArray2%@",sourtArray2);
[mutableArray2 sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
// 將數組中的對象升序排列
return [obj1 compare:obj2];
}];
NSLog(@"mutableArray2%@",mutableArray2);
打印結果為
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是對oc中的一些對象做比較的方法,根據返回值NSComparisonResult判斷比較對象的大小。這里我們主要會用到NSNumer和NSString。NSNumber可以理解,就是直接比較其對應值的大小。而NSString則是對字符串中的字符,根據其ASCII碼逐個進行比較
當比較的對象為NSString類型時,我們還可以為其增加附加條件,比如區分大小寫,不區分大小寫等等,可以通過選擇NSStringCompareOptions的枚舉類型或相應的方法進行實現,這里就不做贅述
- (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返回值的特性,對數組內容進行了排列,你可以試試改為return [obj2 compare:obj1]之后打印的結果
3.如果對于2中的代碼還是不太明白,我們可以看看下面的代碼,可以更直觀的看出利用compare的效果
// 3.原理與2相同,只不過展示的方式更直觀,2中只不過是利用compare的返回值,精簡出來的寫法。
NSArray *sourtArray3 = [stringArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
// 將數組中的字符串升序排列
if ([obj1 compare:obj2] == NSOrderedAscending) {
return NSOrderedAscending;
}else {
return NSOrderedDescending;
}
}];
NSLog(@"sourArray3%@",sourtArray3);
[mutableArray3 sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
// 將數組中的對象升序排列
if ([obj1 integerValue] > [obj2 integerValue]) {
return NSOrderedDescending;
}else {
return NSOrderedAscending;
}
}];
NSLog(@"mutableArray3%@",mutableArray3);
打印結果
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,打印出來會有什么變化。附上示例代碼github NSComparisonResult。