目前找到来4个解决办法,第三个尤为简单方便
/////////1111111 NSArray * arr = @[@"1",@"2",@"3",@"4",@"5"]; //是否包含 if ([arr containsObject:@"3"]) { NSInteger index = [arr indexOfObject:@"3"]; NSLog(@"-1---%ld---",index); } //输出是 2 //////////22222222 if ([arr indexOfObject:@"5"] != NSNotFound) { NSInteger inde =[arr indexOfObject:@"5"] ; NSLog(@"-2---%ld----",inde); }else{ NSLog(@"不存在"); } //////22222---->>>>3333333 NSInteger inde =[arr indexOfObject:@"5"]; if (inde != NSNotFound) { NSLog(@"-2---%ld----",inde); }else{ NSLog(@"不存在"); }
///////44444 用for in 来判断
数组详细方法一
下面的例子以 NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"jonery",@"stany", nil]; 1、获取数组中总共有多少个对象。 - (NSUInteger)count; NSLog(@"%d",[array count]); 2 2、获取数组中下标对应的元素对象.(下标是从0开始) - (id)objectAtIndex:(NSUInteger)index; 3、在当前数据中追加一个新的对象,并且返回一个新的数据对象(新的数组对象和被追加的对象,是两个不同的数组对象)。 - (NSArray *)arrayByAddingObject:(id)anObject; 4、在当前的数组中追加一个新的数据,并且返回一个新的数组对象。 - (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray; 5、使用当前的数组生成一个字符串,新生成的字符串使用提供的separator 字符进行分割。 - (NSString *)componentsJoinedByString:(NSString *)separator; [array compontsJoinedByString:@","]; 运行结果: wendy,andy,tom,jonery,stany 6、检测数据中是否包含指定的对象元素 - (BOOL)containsObject:(id)anObject; [array containsObject:@"tom"]; YES 7、使用当前的数组生成字符串。可以重写description 改变生成的字符串。相当于Java 中的toString 方法。 - (NSString *)description; 运行结果 ( wendy, andy, tom, jonery, stany ) 8、根据设置的locale 进行连接数组 - (NSString *)descriptionWithLocale:(id)locale; - (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level; 9、两个数组的第一个元素是否相同,如果相同,则返回 数组中,第一个元素的字符串,反之,返回null 对象 - (id)firstObjectCommonWithArray:(NSArray *)otherArray; 10、 从数组中获取 NSRange 对象的数据存放到objects 中,NSRange 的数据标示从location,开始后面length 个数据 - (void)getObjects:(id__unsafe_unretained [])objects range:(NSRange)range; NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"jonery",@"stany",@"张山名称",@"asdta", nil]; NSRange range = NSMakeRange(1, 5); id *objects; objects = malloc(sizeof(id) * range.length); [array getObjects:objects range:range]; for(int i = 0; i < range.length; i++){ NSLog(@"%@",objects[i]); } free(objects); 运行的结果 andy tom jonery stany 11、 判断制定的anObject 对象是否存在数组中如果存在返回,对象所在的下标 - (NSUInteger)indexOfObject:(id)anObject; 如果不存在,返回的NSUInteger 与 NSNotFund 相同 NSUIndex index = [array indexOfObject:@"stan"]; if(index == NSNotFound) { 对象不在数组中 } 11-1、 判断制定的元素,是否在数组中,数组查询的位置,是从range.location 的位置开始,到range.length 的长度结束。 - (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range; 如果数据存在,返回指定的下标,如果不存在,则返回NSNotFund 。 实质是使用isEqual 进行比较 12、 同上面两个方法一项,测试指定的对象是否在数组中不同的是,这里使用指针进行比较 - (NSUInteger)indexOfObjectIdenticalTo:(id)anObject; 如果数据存在,返回指定的下标,如果不存在,则返回NSNotFund 。 - (NSUInteger)indexOfObjectIdenticalTo:(id)anObject inRange:(NSRange)range; 13、比较两个数组是否相同 ,数组长度相同,并且相同位置上的元素也相同。 - (BOOL)isEqualToArray:(NSArray *)otherArray; 14、返回最有一个元素,如果一个数组的长度为0 返回的对象为nil - (id)lastObject; 15、使用数组返回一个 NSEnumerator 对象,这个对象类似与一个指针,可以用来遍历 整个数组 指针从前向后遍历 - (NSEnumerator *)objectEnumerator; 示例如下 NSEnumerator *enu = [array objectEnumerator]; id *obj; while (obj = enu.nextObject) { NSLog(@"obj===%@==",obj); } 16、 返回一个NSEnumerator 对象,这个对象类似一个指针,可以用来遍历真个数据,所不同的是,这个指针,是从后向前遍历。 - (NSEnumerator *)reverseObjectEnumerator; 17、生成一个NSData 的对象,主要是用来进行数组的排序。 在下面的方法中使用这个对象 - (NSData *)sortedArrayHint; 18、 进行数组的排序 - (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id,id, void *))comparator context:(void *)context; 这个方法类似苹果实现了一个简单的 排序方法。但是实现的规则需要自己进行处理。 类似的方法如下。 首先提供一个 普通的排序算法,函数和c 的方法类似 NSInteger sortType(id st,id str,void *cha) { NSString *s1 = (NSString *)st; NSString *s2 = (NSString *)str; if(s1.length > s2.length) { return NSOrderedAscending; }else if(s1.length < s2.length) { return NSOrderedDescending; } return NSOrderedSame; } NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil]; NSArray *a = [array sortedArrayUsingFunction:sortType context:nil]; NSLog(@"a=%@",a); NSArray 为需要排序的数组,返回一个排序完成的数组,再执行osrtedArrayUseingFunction 方法时会,会自动调用上面的sortType 方法,并且,可以按照你 的需要调整上面的规则 19、和上面的方法类似,也是苹果用来进行排序的。所不同的是,需要传入一个NSData 的数据。 - (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id,id, void *))comparator context:(void *)context hint:(NSData *)hint; NSData *dat = [array sortedArrayHint]; NSArray *a = [array sortedArrayUsingFunction:sortType context:nil hint:dat]; NSLog(@"a=%@",a);
数组详细方法二:遍历,数组与数组
20、 - (NSArray *)sortedArrayUsingSelector:(SEL)comparator; 这是用来排序的函数,comparator 这个参数,需要传入一个返回结果是NSComparisonResult 的函数, 主要的函数,类似的函数如下: - (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)caseInsensitiveCompare:(NSString *)string; - (NSComparisonResult)localizedCompare:(NSString *)string; - (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string; 都可以进行调用 以 localizedCompare: 函数为例进行调用 NSArray *arr = [[NSArray alloc] initWithObjects:@"test", @"abc", @"xyz", nil]; NSLog(@"Befor sort:%@", arr); SEL sel = @selector(localizedCompare:); arr = [arr sortedArrayUsingSelector:sel]; NSLog(@"After sort:%@", arr); 得到的结果是: abc, test, xyz 21、用来获取数组中range.location 开始,数据各数 为range.length 的数据,并放置到一个新的数组中 以数组 为例 NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil]; - (NSArray *)subarrayWithRange:(NSRange)range; 如: NSArray *test = [array subarrayWithRange:NSMakeRange(2, 2)]; tom, test 注意range 的数值不要越界。 22、写入数组中的数据,到指定path 的目录中: 参数:atomically 是否把文件保存到辅助文件中 - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile; 23、如同上面的方法一样,所不同的是写入数组中的内容到 网上指定的路径。 - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically; 24、这个方法的实现类似于,数组中的元素,都是类对象,aselector 是这些类中的无参方法。 - (void)makeObjectsPerformSelector:(SEL)aSelector; 调用例子如下: 首先新建一个ObjectTest 的类,在其中实现一个 无参数方法 - (void)tttttt 在这个方法的实现中可以打印一些日志 - (void)tttttt { NSLog(@"==========asasdfasdfasdfas==========="); } NSArray *array = [NSArray arrayWithObjects:[[[ObjectTest alloc] init] autorelease],[[[ObjectTest alloc] init] autorelease], nil]; 调用格式如下, [array makeObjectsPerformSelector:@selector(tttttt)]; 这时就可以看到打印的日志信息了。 25、这个方法的调用和上面一个方法类似,所不同的是这个对象调用的方法是一个可以带参数的方法。参数的类型是id ,也就是可以是任意的类型。 - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument; 26、 用来根据indexes 获取一个数组, NSIndexSet 是一个用来管理 index 的对象。 - (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes; 例子如下: NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil]; //NSIndexSet *se = [NSIndexSet indexSetWithIndex:0]; 或者是 NSIndexSet *se = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 2)]; NSArray *test = [array objectsAtIndexes:se]; NSLog(@"%@",test); 27、返回指定下标的一个对象。这个方法类似 objectAtIndex: - (id)objectAtIndexedSubscript:(NSUInteger)idx 28、使用block 块遍历整个数组。这个block 需要三个参数,id obj 表示数组中的元素。 NSUInteger idx 标示元素的下标, bool *stop 是一个bool类型的参数。 官方描述如下: A reference to a Boolean value. The block can set the value to YES to stop further processing of the array. The stop argument is an out-only argument. You should only ever set this Boolean to YES within the Block. - (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx,BOOL *stop))block 调用例子如: NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil]; [array enumerateObjectsUsingBlock:^(id str,NSUInteger index, BOOL* te){ NSLog(@"%@,%d",str,index); }]; 29、同上面的方法一项,区别在于,这里多添加了一个参数,用来标示 是从前向后遍历,还是从后往前遍历。 - (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx,BOOL *stop))block 调用例子如下: NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil]; [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id str,NSUInteger index, BOOL* te){ NSLog(@"%@,%d",str,index); }]; 30、 同上面的方法一项,不过NSIndexSet 参数标示,根据下标取出的数组,这里真正在block 中遍历的数组,是根据NSindexSet 取到的子数组 - (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx,BOOL *stop))block 调用如下: [array enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)] options:NSEnumerationReverse usingBlock:^(id str,NSUInteger index, BOOL* te){ NSLog(@"%@,%d",str,index); }]; 31、 根据条件用来获取一个NSUIndex 对象,主要是根据条件进行数据遍历使用 - (NSUInteger)indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate 调用如下: NSInteger index = [array indexOfObjectPassingTest:^ BOOL (id tr,NSUInteger index, BOOL *te){ NSString *s = (NSString *)tr; if([@"wendy" isEqualToString:s]) { return YES; } return NO; }]; NSLog(@"index==%d=.",index); 32、同上面的方法相同,却别在于,这里添加了一个参数,用来表示遍历是从前向后遍历还是从后遍历。 - (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate 33、这个添加了参数NSIntexSet 参数,用来获取子数组,然后使用这个子数组进行遍历,处理数据 - (NSUInteger)indexOfObjectAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate 31、 根据block 的处理获取一个NSIndexSet 对象。 - (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate 调用如下: NSIndexSet *index = [array indexesOfObjectsPassingTest: ^ BOOL (id tr, NSUInteger index,BOOL *te){ NSString *s = (NSString *)tr; if([s isEqualToString:@"andy"]){ return YES; } return NO; }]; NSLog(@"%@",index); 33 、 这个方法添加了参数,用来表示,是从前向后,遍历还是从后向前遍历 - (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate NS_AVAILABLE(10_6,4_0); 调用示例如下: NSIndexSet *index = [array indexesOfObjectsWithOptions:NSEnumerationReverse passingTest: ^ BOOL (id tr, NSUInteger index,BOOL *te){ NSString *s = (NSString *)tr; if([s isEqualToString:@"andy"]){ return YES; } return NO; }]; NSLog(@"%@",index); 34、 添加参数NSIndexSet 用来获取子数组,使用子数组进行遍历 - (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate 35、对数组进行排序操作 参数cmptr 是一个block 函数块,返回的数据类型是一个NSComparisonResult 对象 - (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr 调用例子如下: NSArray *te = [array sortedArrayUsingComparator:^ NSComparisonResult (NSString *s,NSString *s2){ if(s.length < s2.length){ return NSOrderedAscending; } if(s.length > s2.length){ return NSOrderedDescending; } return NSOrderedSame; }]; NSLog(@"te=%@.",te); 36、进行排序操作,NSSortOptions 排序的参数 用来表示是同时排序,还是稳定执行。 - (NSArray *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6,4_0); NSArray *test = [array sortedArrayWithOptions:NSSortStable usingComparator:^ NSComparisonResult (NSString *s,NSString *s2){ if(s.length < s2.length){ return NSOrderedAscending; } if(s.length > s2.length){ return NSOrderedDescending; } return NSOrderedSame; }]; NSLog(@"%@",test);