版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2017.08.25 |
前言
NSArray
是集合類型中的一種蚌卤,是OC中很重要的概念筐付,這個(gè)是我們一定會(huì)用到的對(duì)象,下面我就繼續(xù)由整體到細(xì)節(jié)记靡,由簡(jiǎn)單到復(fù)雜的和大家說一下它的用法谈竿。感興趣的可以看我寫的上篇幾篇团驱。
1. NSArray簡(jiǎn)單細(xì)說(一)—— 整體了解
2. NSArray簡(jiǎn)單細(xì)說(二)—— 數(shù)組的創(chuàng)建
3. NSArray簡(jiǎn)單細(xì)說(三)—— 數(shù)組初始化
4. NSArray簡(jiǎn)單細(xì)說(四)—— 數(shù)組的查詢與檢索
一、- (NSUInteger)indexOfObject:(ObjectType)anObject;
該方法的作用就是:返回相應(yīng)數(shù)組值等于給定對(duì)象的最低索引空凸。返回值表示相應(yīng)數(shù)組值等于anObject的最低索引嚎花。 如果數(shù)組中的任何對(duì)象都不等于anObject,則返回NSNotFound
呀洲。
從索引0開始紊选,數(shù)組的每個(gè)元素作為參數(shù)傳遞給發(fā)送到aObject
的isEqual:
消息,直到找到匹配或達(dá)到數(shù)組的結(jié)尾道逗。 如果isEqual :
(在NSObject協(xié)議中聲明)返回YES兵罢,則對(duì)象被認(rèn)為是相等的。
下面看一下代碼
- (void)demoIndexOfObject
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSInteger index = [arr indexOfObject:@"are"];
NSLog(@"index = %ld", index);
}
下面看輸出結(jié)果
2017-08-25 11:13:21.704 JJOC[4205:106064] index = 1
結(jié)論:很簡(jiǎn)單滓窍,看看就可以了卖词。
二、- (NSUInteger)indexOfObject:(ObjectType)anObject inRange:(NSRange)range;
該方法的作用就是:返回指定范圍內(nèi)的最小索引贰您,其對(duì)應(yīng)的數(shù)組值等于給定對(duì)象坏平。對(duì)應(yīng)數(shù)組值等于Object的范圍內(nèi)的最小索引。 如果范圍內(nèi)的任何對(duì)象都不等于一個(gè)對(duì)象锦亦,則返回NSNotFound
。
從range.location
開始令境,數(shù)組的每個(gè)元素作為參數(shù)傳遞給發(fā)送到anObject
的isEqual:
消息杠园,直到找到匹配或達(dá)到范圍的結(jié)尾。 如果isEqual:
對(duì)象被視為相等舔庶,則返回YES抛蚁。如果range參數(shù)表示數(shù)組中不存在的范圍,則此方法將引發(fā)NSRangeException
異常惕橙。
下面我們看代碼
- (void)demoIndexOfObjectRange
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSInteger index1 = [arr indexOfObject:@"You" inRange:NSMakeRange(0, 1)];
NSLog(@"index1 = %ld", index1);
NSInteger index2 = [arr indexOfObject:@"You" inRange:NSMakeRange(0, arr.count)];
NSLog(@"index2 = %ld", index2);
}
下面看輸出結(jié)果
2017-08-25 11:20:26.991 JJOC[4541:115574] index1 = 9223372036854775807
2017-08-25 11:20:26.991 JJOC[4541:115574] index2 = 4
結(jié)論:很簡(jiǎn)單瞧甩,看看就可以了。
三弥鹦、- (NSUInteger)indexOfObjectIdenticalTo:(ObjectType)anObject;
該方法的作用就是:返回對(duì)應(yīng)數(shù)組值與給定對(duì)象相同的最低索引肚逸。對(duì)于返回值,相應(yīng)數(shù)組值與anObject相同的最低索引彬坏。 如果數(shù)組中的任何對(duì)象與anObject相同朦促,則返回NSNotFound
。
下面我們看代碼
- (void)demoIndexOfObjectIdenticalTo
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSInteger index = [arr indexOfObjectIdenticalTo:@"are"];
NSLog(@"index = %ld", index);
}
下面看輸出結(jié)果
2017-08-25 11:24:34.290 JJOC[4725:121132] index = 1
結(jié)論:很簡(jiǎn)單栓始,看看就可以了务冕。
四、- (NSUInteger)indexOfObjectIdenticalTo:(ObjectType)anObject inRange:(NSRange)range;
該方法的作用就是:返回指定范圍內(nèi)的最小索引幻赚,其對(duì)應(yīng)的數(shù)組值等于給定對(duì)象禀忆。對(duì)于返回值臊旭,對(duì)應(yīng)數(shù)組值與Object相同的范圍內(nèi)的最小索引。 如果范圍內(nèi)的任何對(duì)象與對(duì)象相同箩退,則返回NSNotFound
巍扛。
這里還要注意:如果對(duì)象的對(duì)象地址相同,則對(duì)象被認(rèn)為是相同的乏德。
下面我們看代碼
- (void)demoIndexOfObjectIdenticalToRange
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSInteger index1 = [arr indexOfObjectIdenticalTo:@"You" inRange:NSMakeRange(0, 1)];
NSLog(@"index1 = %ld", index1);
NSInteger index2 = [arr indexOfObjectIdenticalTo:@"You" inRange:NSMakeRange(0, arr.count)];
NSLog(@"index2 = %ld", index2);
}
下面看輸出結(jié)果
2017-08-25 11:29:00.143 JJOC[4922:127550] index1 = 9223372036854775807
2017-08-25 11:29:00.143 JJOC[4922:127550] index2 = 4
結(jié)論:很簡(jiǎn)單撤奸,看看就可以了。
五喊括、- (NSUInteger)indexOfObjectPassingTest:(BOOL (^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate;
該方法的作用就是:返回?cái)?shù)組中通過給定塊中測(cè)試的第一個(gè)對(duì)象的索引胧瓜。
下面我們看一下參數(shù)和返回值:
-
predicate
:要應(yīng)用于數(shù)組元素的塊。塊有三個(gè)參數(shù):-
obj
:數(shù)組中的元素郑什。 -
idx
:數(shù)組中元素的索引府喳。 -
stop
:對(duì)布爾值的引用。 該塊可以將值設(shè)置為YES以停止對(duì)數(shù)組的進(jìn)一步枚舉蘑拯。 如果一個(gè)程序段停止進(jìn)一步的枚舉钝满,該程序段將繼續(xù)運(yùn)行直到完成。 停止參數(shù)是一個(gè)out-only參數(shù)申窘。 您應(yīng)該只在塊中將此布爾值設(shè)置為YES弯蚜。
-
該塊返回一個(gè)布爾值,指示obj是否通過了測(cè)試剃法。 返回YES將停止數(shù)組的進(jìn)一步處理碎捺。
- return :數(shù)組中相應(yīng)值通過謂詞指定的測(cè)試的最低索引。 如果數(shù)組中沒有對(duì)象通過測(cè)試贷洲,則返回
NSNotFound
收厨。
下面我們就看一下代碼
- (void)demoIndexOfObjectPassingTest
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSInteger index = [arr indexOfObjectPassingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"Miss"]) {
* stop = YES;
return YES;
}
return NO;
}];
NSLog(@"index = %ld", index);
}
下面看輸出結(jié)果
2017-08-25 11:43:10.696 JJOC[5389:144910] index = 3
結(jié)論:很簡(jiǎn)單,看看就可以了优构。
六诵叁、- (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate;
該方法的作用就是:返回?cái)?shù)組中的對(duì)象,該對(duì)象在給定的塊中傳遞給定的枚舉選項(xiàng)集的測(cè)試钦椭。
下面看一下參數(shù)和返回值:
-
opts
:一個(gè)位掩碼拧额,指定枚舉的選項(xiàng)(是否應(yīng)同時(shí)執(zhí)行,是否應(yīng)以相反的順序執(zhí)行)玉凯。是一個(gè)枚舉值势腮,如下所以。
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
NSEnumerationConcurrent = (1UL << 0),
NSEnumerationReverse = (1UL << 1),
};
-
predicate
:要應(yīng)用于數(shù)組元素的塊漫仆。塊有三個(gè)參數(shù):-
obj
:數(shù)組中的元素捎拯。 -
idx
:數(shù)組中元素的索引。 -
stop
:對(duì)布爾值的引用。 該塊可以將值設(shè)置為YES以停止對(duì)數(shù)組的進(jìn)一步枚舉署照。 如果一個(gè)程序段停止進(jìn)一步的枚舉祸泪,該程序段將繼續(xù)運(yùn)行直到完成。 停止參數(shù)是一個(gè)out-only參數(shù)建芙。 您應(yīng)該只在塊中將此布爾值設(shè)置為YES没隘。
-
該塊返回一個(gè)布爾值,指示obj是否通過了測(cè)試禁荸。 返回YES將停止數(shù)組的進(jìn)一步處理右蒲。
-
return
:數(shù)組中相應(yīng)的值通過謂詞和opts指定的測(cè)試的索引。 如果opts位掩碼指定反向順序赶熟,則返回匹配的最后一個(gè)項(xiàng)瑰妄。 否則,返回第一個(gè)匹配對(duì)象的索引映砖。 如果數(shù)組中沒有對(duì)象通過測(cè)試间坐,則返回NSNotFound
。
需要注意的是:
- 默認(rèn)情況下邑退,枚舉從第一個(gè)對(duì)象開始竹宋,并通過數(shù)組連續(xù)地繼續(xù)到最后一個(gè)對(duì)象。 您可以指定
NSEnumerationConcurrent
和/或NSEnumerationReverse
作為枚舉選項(xiàng)來修改此行為地技。 - 如果
block
參數(shù)為nil蜈七,此方法將引發(fā)異常。
下面看代碼
- (void)demoIndexOfObjectWithOptions
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSInteger index = [arr indexOfObjectWithOptions:NSEnumerationConcurrent passingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"Miss"]) {
* stop = YES;
return YES;
}
return NO;
}];
NSLog(@"index = %ld", index);
}
下面看輸出結(jié)果
2017-08-25 12:09:37.204 JJOC[6075:170839] index = 3
結(jié)論:很簡(jiǎn)單乓土,看看就可以了宪潮。
七、- (NSUInteger)indexOfObjectAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate;
該方法的作用:從給定的一組索引中返回在給定塊中為特定的枚舉選項(xiàng)集傳遞測(cè)試的數(shù)組中的第一個(gè)對(duì)象的索引趣苏。
下面我們看一下參數(shù)和返回值:
- s:要枚舉的對(duì)象的索引。
- opts :一個(gè)位掩碼梯轻,指定枚舉的選項(xiàng)(是否應(yīng)同時(shí)執(zhí)行食磕,是否應(yīng)以相反的順序執(zhí)行)。是一個(gè)枚舉值喳挑,前面已經(jīng)說過了彬伦,這里就不多說了。
-
predicate
:要應(yīng)用于數(shù)組元素的塊伊诵。塊有三個(gè)參數(shù):-
obj
:數(shù)組中的元素单绑。 -
idx
:數(shù)組中元素的索引。 -
stop
:對(duì)布爾值的引用曹宴。 該塊可以將值設(shè)置為YES以停止對(duì)數(shù)組的進(jìn)一步枚舉搂橙。 如果一個(gè)程序段停止進(jìn)一步的枚舉,該程序段將繼續(xù)運(yùn)行直到完成笛坦。 停止參數(shù)是一個(gè)out-only參數(shù)区转。 您應(yīng)該只在塊中將此布爾值設(shè)置為YES苔巨。
-
-
return
:數(shù)組中相應(yīng)值通過謂詞指定的測(cè)試的最低索引。 如果數(shù)組中沒有對(duì)象通過測(cè)試废离,則返回NSNotFound
侄泽。
這里還要注意:
- 默認(rèn)情況下,枚舉從第一個(gè)對(duì)象開始蜻韭,并且通過數(shù)組連續(xù)地繼續(xù)到由indexSet指定的最后一個(gè)元素悼尾。 您可以指定
NSEnumerationConcurrent
和/或NSEnumerationReverse
作為枚舉選項(xiàng)來修改此行為。 - 如果block參數(shù)或
indexSet
為nil肖方,此方法將引發(fā)異常闺魏。
下面看代碼
- (void)demoIndexOfObjectAtIndexes
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSIndexSet *set = [NSIndexSet indexSetWithIndex:3];
NSInteger index = [arr indexOfObjectAtIndexes:set options:NSEnumerationConcurrent passingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"You"]) {
* stop = YES;
return YES;
}
NSLog(@"NO");
return NO;
}];
NSLog(@"index = %ld", index);
}
下面看輸出結(jié)果
2017-08-25 12:24:52.962 JJOC[6485:186972] NO
2017-08-25 12:24:52.963 JJOC[6485:186972] index = 9223372036854775807
結(jié)論:很簡(jiǎn)單,看看就可以了窥妇。
八舷胜、- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate;
該方法的作用就是:返回在給定塊中通過測(cè)試的數(shù)組中的對(duì)象的索引。
對(duì)于參數(shù)這里就不多說了活翩,前面都已經(jīng)說過了烹骨。對(duì)于返回值,數(shù)組中相應(yīng)值的索引通過謂詞指定的測(cè)試材泄。 如果數(shù)組中沒有對(duì)象通過測(cè)試沮焕,則返回一個(gè)空索引集。
下面看代碼
- (void)demoIndexesOfObjectsPassingTest
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSIndexSet *set = [arr indexesOfObjectsPassingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"Miss"]) {
* stop = YES;
return YES;
}
return NO;
}];
NSLog(@"indexSet = %@", set);
}
下面看輸出結(jié)果
2017-08-25 12:29:58.274 JJOC[6667:192427] indexSet = <_NSCachedIndexSet: 0x608000221300>[number of indexes: 1 (in 1 ranges), indexes: (3)]
結(jié)論:很簡(jiǎn)單拉宗,看看就可以了峦树。
九、- (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate;
該方法的作用就是:返回?cái)?shù)組中對(duì)于給定的一組枚舉選項(xiàng)在給定塊中傳遞測(cè)試的對(duì)象的索引旦事。
對(duì)于參數(shù)也不多說了魁巩,前面已經(jīng)說過了。
這里還要注意:
- 對(duì)于返回值姐浮,數(shù)組中相應(yīng)值的索引通過謂詞指定的測(cè)試谷遂。 如果數(shù)組中沒有對(duì)象通過測(cè)試,則返回一個(gè)空索引集卖鲤。
- 默認(rèn)情況下肾扰,枚舉從第一個(gè)對(duì)象開始,并通過數(shù)組連續(xù)地繼續(xù)到最后一個(gè)對(duì)象蛋逾。 您可以指定
NSEnumerationConcurrent
和/或NSEnumerationReverse
作為枚舉選項(xiàng)來修改此行為集晚。 - 如果block參數(shù)為nil,此方法將引發(fā)異常区匣。
下面看代碼
- (void)demoindexesOfObjectsWithOptions
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSIndexSet *set = [arr indexesOfObjectsWithOptions:NSEnumerationReverse passingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"Miss"]) {
* stop = YES;
return YES;
}
return NO;
}];
NSLog(@"indexSet = %@", set);
}
下面看結(jié)果
2017-08-25 12:37:43.290 JJOC[6901:200113] indexSet = <_NSCachedIndexSet: 0x60800002d4a0>[number of indexes: 1 (in 1 ranges), indexes: (3)]
結(jié)論:很簡(jiǎn)單偷拔,看看就可以了。
十、- (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate;
該方法的作用就是:從給定的一組索引中返回在給定塊中為特定的枚舉選項(xiàng)集傳遞測(cè)試的數(shù)組中的對(duì)象的索引条摸。
這里還要注意:
- 數(shù)組中相應(yīng)值的索引通過謂詞指定的測(cè)試悦污。 如果數(shù)組中沒有對(duì)象通過測(cè)試,則返回一個(gè)空索引集钉蒲。
- 默認(rèn)情況下切端,枚舉從第一個(gè)對(duì)象開始,并且通過數(shù)組連續(xù)地繼續(xù)到由indexSet指定的最后一個(gè)元素顷啼。 您可以指定
NSEnumerationConcurrent
和/或NSEnumerationReverse
作為枚舉選項(xiàng)來修改此行為踏枣。 - 如果block參數(shù)或
indexSet
為nil,此方法將引發(fā)異常钙蒙。
下面我們看代碼
- (void)demoIndexesOfObjectsAtIndexesOptions
{
NSArray *arr = @[@"How", @"are", @"you", @"Miss", @"You"];
NSIndexSet *preSet = [NSIndexSet indexSetWithIndex:3];
NSIndexSet *set = [arr indexesOfObjectsAtIndexes:preSet options:NSEnumerationConcurrent passingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"Miss"]) {
* stop = YES;
return YES;
}
return NO;
}];
NSLog(@"indexSet = %@", set);
}
下面看輸出結(jié)果
2017-08-25 12:48:56.007 JJOC[7200:211534] indexSet = <_NSCachedIndexSet: 0x60000002a460>[number of indexes: 1 (in 1 ranges), indexes: (3)]
結(jié)論:很簡(jiǎn)單茵瀑,看看就可以了。
十一躬厌、- (NSUInteger)indexOfObject:(ObjectType)obj inSortedRange:(NSRange)r options:(NSBinarySearchingOptions)opts usingComparator:(NSComparator)cmp;
該方法的作用就是:使用給定的NSComparator
塊马昨,返回與數(shù)組中的元素相比較的對(duì)象的指定范圍內(nèi)的索引。也可以簡(jiǎn)說:指定區(qū)域返回通過代碼塊方法的索引扛施,實(shí)現(xiàn)的就是二分查找鸿捧。
下面看一下參數(shù)和返回值:
-
obj
:在數(shù)組中搜索的對(duì)象。如果此值為nil疙渣,則拋出NSInvalidArgumentException
匙奴。 -
r
:數(shù)組中的范圍來搜索obj
。如果r超出數(shù)組的邊界(如果位置加上范圍的長(zhǎng)度大于數(shù)組的數(shù)目)妄荔,則拋出NSRangeException
泼菌。 -
opts
:搜索選項(xiàng)。 有關(guān)可能的值啦租,請(qǐng)參閱NSBinarySearchingOptions
哗伯。如果同時(shí)指定NSBinarySearchingFirstEqual
和NSBinarySearchingLastEqual
,則拋出NSInvalidArgumentException
異常篷角。
它是一個(gè)枚舉笋颤,如下所示:
typedef NS_OPTIONS(NSUInteger, NSBinarySearchingOptions) {
NSBinarySearchingFirstEqual = (1UL << 8),
NSBinarySearchingLastEqual = (1UL << 9),
NSBinarySearchingInsertionIndex = (1UL << 10),
};
-
cmp
:用于將對(duì)象obj與數(shù)組中的元素進(jìn)行比較的比較器塊。如果此值為NULL内地,則拋出NSInvalidArgumentException
。 -
return
:對(duì)于返回值可以參考下面的關(guān)系赋除。
如果未指定NSBinarySearchingInsertionIndex
選項(xiàng):
- 如果找到obj阱缓,并且未指定
NSBinarySearchingFirstEqual
和NSBinarySearchingLastEqual
,則返回任意匹配對(duì)象的索引举农。 - 如果還指定了
NSBinarySearchingFirstEqual
選項(xiàng)荆针,則返回相等對(duì)象的最低索引。 - 如果還指定了
NSBinarySearchingLastEqual
選項(xiàng),則返回相等對(duì)象的最高索引航背。 - 如果沒有找到該對(duì)象喉悴,返回
NSNotFound
。
如果指定了NSBinarySearchingInsertionIndex
選項(xiàng)玖媚,則返回您應(yīng)該插入obj的索引箕肃,以便維護(hù)排序的數(shù)組:
- 如果找到了obj,并且未指定
NSBinarySearchingFirstEqual
和NSBinarySearchingLastEqual
今魔,則返回與任何匹配對(duì)象的索引相等或相等的一個(gè)索引勺像。 - 如果還指定了
NSBinarySearchingFirstEqual
選項(xiàng),則返回相等對(duì)象的最低索引 - 如果還指定了
NSBinarySearchingLastEqual
選項(xiàng)错森,則返回相等對(duì)象的最高索引吟宦。 - 如果未找到對(duì)象,則返回最小更大對(duì)象的索引涩维,或者如果對(duì)象大于所有其他元素殃姓,則返回?cái)?shù)組末尾的索引。
這里還要注意:
- 必須使用比較器cmp對(duì)數(shù)組中的元素進(jìn)行排序瓦阐。 如果數(shù)組未排序蜗侈,則結(jié)果未定義。
下面看代碼
- (void)demoIndexOfObjectComparator
{
NSArray *arr = @[@"1", @"2", @"3", @"4", @"5"];
NSInteger *index = [arr indexOfObject:@"4" inSortedRange:NSMakeRange(0, arr.count) options:NSBinarySearchingLastEqual usingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"index = %d", index);
}
下面看輸出結(jié)果
2017-08-25 15:25:08.410 JJOC[10137:295858] index = 3
參考文章
后記
未完垄分,待續(xù)~~~