热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Objective-C中NSArray的基本用法示例

这篇文章主要介绍了Objective-C中NSArray的基本用法示例,包括基本的排序等方法的介绍,需要的朋友可以参考下

NSArray的排序

代码如下:

+ (id)studentWithFirstName:(NSString *)firstName lastName:(NSString *)lastName{ 
     
    Student *stu = [[Student alloc] init]; 
     
    stu.firstName = firstName; 
    stu.lastName = lastName; 
     
    return stu; 

 
+ (id)studentWithFirstName:(NSString *)firstName lastName:(NSString *)lastName bookName:(NSString *)bookName{ 
 
    Student *stu = [Student studentWithFirstName:firstName lastName:lastName]; 
     
    stu.book = [Book bookWithName:bookName]; 
     
    return stu; 
 

 
- (NSComparisonResult)compareStudent:(Student *)stu{ 
     
    NSComparisonResult result = [self.firstName compare:stu.firstName]; 
     
    if (result == NSOrderedSame) { 
        result = [self.lastName compare:stu.lastName]; 
    } 
     
    return result; 
     

 
- (NSString *)description{  
  
    //return [NSString stringWithFormat:@" %@ %@ %@",self.firstName,self.lastName,self.book.name]; 
    return [NSString stringWithFormat:@" %@ %@ %@",self.firstName,self.lastName,_book.name]; 

 
 
#pragma mark 3.NSArray排序1 
void arraySort1(){ 
     
    NSArray *array = [NSArray arrayWithObjects:@"2",@"3",@"1",@"4", nil nil]; 
     
    // 指定系统自带规定的比较方法compare: 
    NSArray *array2 = [array sortedArrayUsingSelector:@selector(compare:)]; 
    NSLog(@"%@",array2); 
     

 
#pragma mark 3.NSArray排序2 
void arraySort2(){  
      
    Student *stu1 = [Student studentWithFirstName:@"hu" lastName:@"mingtao"]; 
    Student *stu2 = [Student studentWithFirstName:@"zhu" lastName:@"wenpeng"]; 
    Student *stu3 = [Student studentWithFirstName:@"zhao" lastName:@"weisong"]; 
    Student *stu4 = [Student studentWithFirstName:@"hu" lastName:@"junpeng"]; 
     
    NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3,stu4, nil nil]; 
     
    // 类似JAVA中得compareTo,自己定义比较方式,但是一定要实现compare方法 
    NSArray *array2 = [array sortedArrayUsingSelector:@selector(compareStudent:)]; 
     
    NSLog(@"%@",array2); 
 

 
#pragma mark 3.NSArray排序3-Block排序 
void arraySort3(){ 
     
    Student *stu1 = [Student studentWithFirstName:@"hu" lastName:@"mingtao"]; 
    Student *stu2 = [Student studentWithFirstName:@"zhu" lastName:@"wenpeng"]; 
    Student *stu3 = [Student studentWithFirstName:@"zhao" lastName:@"weisong"]; 
    Student *stu4 = [Student studentWithFirstName:@"hu" lastName:@"junpeng"]; 
     
    NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3,stu4, nil nil]; 
     
    NSArray *array2 = [array sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) { 
        NSComparisonResult result = [obj1.firstName compare:obj2.firstName]; 
         
        if (result == NSOrderedSame) { 
            result = [obj1.lastName compare:obj2.lastName]; 
        }  
          
        return result; 
    }]; 
     
    NSLog(@"%@",array2); 
 
     
}  
 
#pragma mark 4.NSArray排序4-高级排序 
void arraySort4(){ 
     
    Student *stu1 = [Student studentWithFirstName:@"hu" lastName:@"mingtao" bookName:@"lianai"]; 
    Student *stu2 = [Student studentWithFirstName:@"zhu" lastName:@"wenpeng" bookName:@"tianshi"]; 
    Student *stu3 = [Student studentWithFirstName:@"zhao" lastName:@"weisong" bookName:@"love"]; 
    Student *stu4 = [Student studentWithFirstName:@"hu" lastName:@"junpeng" bookName:@"qingren"]; 
     
    NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3,stu4, nil nil]; 
     
    // 1.先按照书名进行排序 
    NSSortDescriptor *bookNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"book.name" ascending:YES]; 
    // 2.先按照姓进行排序 
    NSSortDescriptor *firstNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]; 
    // 3.先按照名进行排序 
    NSSortDescriptor *lastNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES]; 
 
    NSArray *array2 = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:bookNameDesc,firstNameDesc,lastNameDesc, nil nil]]; 
     
    NSLog(@"%@",array2);  
      
     
}


NSArray的一些用法
NSArray  只允许装OC对象,并且不能装空值,空代表数组元素的结束

代码如下:

#pragma mark - NSArray的基本用法
   // 创建一个空数组
      NSArray *array = [NSArray array];
   // 创建有一个元素的数组
      array = [NSArray arrayWithObject:@"123"];
    // 创建有多个元素的数组
      array = [NSArray arrayWIthObjects:@"a",@"b",nil ];//不能装nil空指针,空值代表数组元素结束
    // 将一个数组赋值给一个数组
    + (instancetype)arrayWithArray:(NSArray *)array;
    // 获取元素的个数
       int count = [array count]; //和 count = array.count; 相同,都是调用get方法
    // 是否包含一个元素
      - (bool)containsObject:(id)anObject;
    // 返回最后一个元素
       - (id) lastObject;
     // 获取index位置的元素
        - (id)objectAtIndex:(NSUInteger) index;
     // 获取元素的位置
        - (NSUInteger) indexOfObject:(id)anObject;
     // 在range范围内查找元素的位置
        - (NSUInteger) indexofObject:(id)anObject inRange:(NSRange)range;
     // 比较两个集合内容是否相同
        - (Bool) isEqualToArray:(NSArray *)otherArray;
     // 返回两个集合中第一个相同的对象元素
        - (id) firstObjectCommonWithArray:(NSArray *)otherArray;

#pragma mark - NSArray的高级用法
        //让集合里面的所有元素都执行aSelector这个方法
           - (void)makeObjectsPerformSelector:(SEL)aSelector;
        //让集合里面的所有元素都执行aSelector这个方法,给这个方法添加参数,但是只支持一个参数
           - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument
        //添加一个元素,返回一个新的NSArray(方法调用者本身没有发生变化)
           - (NSArray *)arrayByAddingObject:(id)anObject
       //添加otherArray的所有元素,返回一个新的NSArray(方法着本身没有改变)
           - (NSArray *) arrayByAddingObjectsFromArray:(NSArray *) otherArray;
       //截取range范围的数组
           - (NSArray *) subarrayWithRange:(NSRenge)range;
      //用separator做拼接符,拼接成一个字符串
           - (NSString *) componentsJoinedByString:(NSString *)separator
      //将NSArray持久化到文件中去
           - (Bool) writeToFile:(NSString *)path atomically:(Bool)useAuxiliaryFile

#pragma mark - NSArray的遍历
     // 方法一:普通遍历(利用for循环)
       void arrayFor1(){
        NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
        int count = array.count;
        for(int i=0; i               id obj = [array objectAtIndex:i];
             NSLog(@"%i-%@",i, obj);
        }
       }

     // 方法二:快速遍历
       void arrayFor2(){
           NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
           int count = array.count;
           int i=0;
           for(id obj in array){
                NSLog(@"%i-%@",i, obj);
                i++;
           }
         }

     // 方法三:利用block遍历
          void arrayFor3(){
               NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
               [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                       NSLog(@"%zi->%@",idx, obj);
                        //  *stop = YES; //改变外边的Bool,终止遍历
                  }];
             }

    // 方法四:利用迭代器
 先介绍一下-->NSEnumerator迭代器:集合的迭代器,可以用于遍历集合元素,NSArray 有相应的方法来获取迭代器
                  //获取一个正序遍历的迭代器
                     - (NSEnumerator *) objectEnumerator;
                 //获取一个反序遍历的迭代器
                     - (NSEnumerator *) reverseObjectEnumerator;
                @常用方法:
                 //获取下一个元素
                    - (id) nextObject;
                 //获取所有的元素
                    - (NSArray *) allObjects
          void arrayFor4(){
                   NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
                   NSEnumerator *enumerator = [array objectEnumerator];// 返回数组的迭代器
                   //如果放到遍历之后,则取到空,原因是,遍历完了,就没值了
                   NSArray *array2 = [enumerator allObjects];
                   NSLog(@"array2=%@", array2);
   
                 //获取下一个需要遍历的元素
                   id obj = nil;
                   while (obj = [enumerator nextObject]) {
                         NSLog(@"obj=%@", obj);
                   }
                  }


使用block 块遍历整个数组。这个block 需要三个参数,id obj 表示数组中的元素。 
NSUInteger idx 标示元素的下标, 
boolbool *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,BOOLBOOL *stop))block  
调用例子如: 
 

代码如下:
 
NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil nil];  
  
  
   [array enumerateObjectsUsingBlock:^(id str,NSUInteger index, BOOL* te){ 
       NSLog(@"%@,%d",str,index); 
   }]; 

同上面的方法一项,区别在于,这里多添加了一个参数,用来标示 是从前向后遍历,还是从后往前遍历。 
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx,BOOLBOOL *stop))block 
调用例子如下: 
代码如下:

NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil nil]; 
 
 
    [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id str,NSUInteger index, BOOL* te){ 
        NSLog(@"%@,%d",str,index);  
    }]; 


推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • jsappsugar,基于,js,语法,定义 ... [详细]
  • 我的iOS开发入门自学路径
    我有一个清单,列着希望在大学里完成的事。比如,学一门乐器,和朋友去旅游,搭建自己的博客,去滑翔,看各主题的书籍。其中一项是,写自己的App并且上架。去年开始,我准备完成这一项,所以 ... [详细]
  • 概述UIStackView是iOS9中新增的API,类似于Android中的线性布局。UIStackView相当于一个容器,根据向UIStackView中添加视图的顺序,UIStack ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • ObjectiveC与Swift之间的互相调用和跳转
    Objective-C与Swift之间的互相调用和跳转-一、OC和Swift互相跳转首先在需要引入Swift的文件中导入头文件#import工程名-Swift.hOC跳转Swift ... [详细]
author-avatar
羽靜幻雲_100
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有