zoukankan      html  css  js  c++  java
  • NSArray排序

    main函数:

      1 //
      2 //  main.m
      3 //  NSArray排序
      4 //
      5 //  Created by dingxiaowei on 13-5-13.
      6 //  Copyright (c) 2013年 dingxiaowei. All rights reserved.
      7 //
      8 
      9 #import <Foundation/Foundation.h>
     10 #import "Student.h"
     11 #pragma mark - 派生出新数组
     12 void newArray(){
     13     NSArray *array1=[NSArray arrayWithObjects:@"1",@"2", nil];
     14     NSArray *array2=[array1 arrayByAddingObject:@"3"];//添加元素
     15     NSLog(@"array1:%@\narray2:%@",array1,array2);
     16 
     17     NSArray *array3=[array1 arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:@"4",@"5",@"6",nil]]; //将后面一个array附加z在array1的前面
     18     NSLog(@"array3:%@",array3);
     19 
     20     //截取array中的元素
     21     NSRange range=NSMakeRange(2, 2);//从第三个位置截取两个范围
     22     NSArray *array4=[array3 subarrayWithRange:range];//截取数组元素
     23     NSLog(@"截取后的数组是:%@",array4);
     24 
     25     
     26 }
     27 
     28 #pragma mark - 数组的其他用法
     29 void arrayOther(){
     30     NSArray * array=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",nil];
     31     //用符号将数组拼接成字符串
     32     NSString *str=[array componentsJoinedByString:@","];
     33     NSLog(@"str=%@",str);
     34 
     35     //将数组写入到文件
     36     NSString *path=@"/Users/dingxiaowei/Desktop/array.xml";
     37     [array writeToFile:path atomically:YES];//原子性就是等全部加载到文件中再写入
     38     NSLog(@"文件写入成功");
     39     //从文件中读取内容(文件格式由严格的要求)
     40     NSArray *arrayRead=[NSArray arrayWithContentsOfFile:path];
     41     NSLog(@"读取文件的内容:%@",arrayRead);
     42     NSLog(@"文件读取成功");
     43 }
     44 
     45 #pragma mark - 数组排序
     46 void arraySort1(){
     47     NSArray * array=[NSArray arrayWithObjects:@"5",@"2",@"3",@"4",nil];
     48     //指定元素的比较方法 数组中元素之间diao
     49     NSArray *newArray=[array sortedArrayUsingSelector:@selector(compare:)];//返回一个新的排序后的数组,原来的那个数组不可变   依次调用compare方法
     50     NSLog(@"排序后的数组:%@",newArray);
     51 }
     52 #pragma mark - 数组排序2(对对象进行排序)
     53 void arraySort2(){
     54     Student *stu1=[Student initeWithFirstName:@"xiaowei" andLastName:@"ding"];
     55     Student *stu2=[Student initeWithFirstName:@"lianjie" andLastName:@"li"];
     56     Student *stu3=[Student initeWithFirstName:@"xiaolong" andLastName:@"ding"];
     57     Student *stu4=[Student initeWithFirstName:@"pengyu" andLastName:@"han"];
     58     
     59     NSArray *array=[NSArray arrayWithObjects:stu1,stu2,stu3,stu4,nil];
     60     //按照学生的姓名进行排序
     61     NSArray *newArray=[array sortedArrayUsingSelector:@selector(compareStudent:)];
     62     NSLog(@"排序后的学生数组是:%@",newArray);
     63 }
     64 #pragma mark - block排序
     65 void arraySort3(){
     66     Student *stu1=[Student initeWithFirstName:@"xiaowei" andLastName:@"ding"];
     67     Student *stu2=[Student initeWithFirstName:@"lianjie" andLastName:@"li"];
     68     Student *stu3=[Student initeWithFirstName:@"xiaolong" andLastName:@"ding"];
     69     Student *stu4=[Student initeWithFirstName:@"pengyu" andLastName:@"han"];
     70 
     71     NSArray *array=[NSArray arrayWithObjects:stu1,stu2,stu3,stu4,nil];
     72     //利用block进行排序
     73     NSArray *newArray=[array sortedArrayUsingComparator:^NSComparisonResult(Student * obj1, Student * obj2) {
     74         //先按照姓氏排序
     75         NSComparisonResult *result=[obj1.lastName compare:obj2.lastName];
     76         //如果由相同的姓,则比较名
     77         if(result==NSOrderedSame)
     78         {
     79             result=[obj1.firstName compare:obj2.firstName];
     80         }
     81         return result;
     82     }];
     83     NSLog(@"排序后的学生数组是:%@",newArray);
     84 }
     85 #pragma mark - 带有Book类的学生进行排序
     86 void arraySort4(){
     87     Student *stu1=[Student initeWithFirstName:@"xiaowei" andLastName:@"ding" andBookName:@"book1"];
     88     Student *stu2=[Student initeWithFirstName:@"lianjie" andLastName:@"li" andBookName:@"book2"];
     89     Student *stu3=[Student initeWithFirstName:@"xiaolong" andLastName:@"ding" andBookName:@"book2"];
     90     Student *stu4=[Student initeWithFirstName:@"pengyu" andLastName:@"han" andBookName:@"book1"];
     91 
     92     NSArray *array=[NSArray arrayWithObjects:stu1,stu2,stu3,stu4,nil];
     93     //1.先按照书名进行排序
     94     //排序描述类
     95     //先按照书进行排序
     96     NSSortDescriptor *bookNameDes=[NSSortDescriptor sortDescriptorWithKey:@"book.name" ascending:YES];//YES代表升序   第一个参数跟类的成员名要一致 这儿写成book.name是因为Student对象本身就有个Book*类型的book成员,然而book又有个name属性
     97     //再按照姓进行排序
     98     NSSortDescriptor *lastNameDes=[NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES];//YES代表升序    //这儿的lastName要跟前面的成员名一致及propert里面的lastName一致
     99     //再按照名进行排序
    100     NSSortDescriptor *firstNameDes=[NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES];//YES代表升序
    101 
    102     //类名排序类
    103     NSArray *desc=[NSArray arrayWithObjects:bookNameDes,lastNameDes,firstNameDes,nil];
    104     NSArray *array2=[array sortedArrayUsingDescriptors:desc];//按照那个排序类里面的成员依次进行排序
    105     NSLog(@"未排序之前的成员顺序是:%@",array);
    106     NSLog(@"排序后的成员(先按书名排序,后按照姓名排序):%@",array2);
    107 }
    108 int main(int argc, const char * argv[])
    109 {
    110 
    111     @autoreleasepool {
    112         
    113 //        newArray();
    114 //        arrayOther();
    115 //        arraySort1();
    116 //        arraySort2();
    117 //        arraySort3();
    118         arraySort4();
    119     }
    120     return 0;
    121 }

    Student.h

     1 #import <Foundation/Foundation.h>
     2 
     3 @class Book;
     4 
     5 
     6 @interface Student : NSObject
     7 @property(nonatomic,retain) NSString *firstName; //
     8 @property(nonatomic,retain) NSString *lastName; //
     9 @property(nonatomic,retain) Book *book;//这是一本书
    10 //初始化带有姓名的学生
    11 +(id)initeWithFirstName:(NSString *) firstName andLastName:(NSString *)lastName;
    12 //初始化一个拥有书名且由姓名的学生
    13 +(id)initeWithFirstName:(NSString *) firstName andLastName:(NSString *)lastName andBookName:(NSString *)bookName;
    14 //设置一个比较函数 返回值为NSComparisonResult
    15 -(NSComparisonResult)compareStudent:(Student *)stu;
    16 @end

    Student.m

     1 //
     2 //  Student.m
     3 //  NSArray排序
     4 //
     5 //  Created by dingxiaowei on 13-5-13.
     6 //  Copyright (c) 2013年 dingxiaowei. All rights reserved.
     7 //
     8 
     9 #import "Student.h"
    10 #import "Book.h"
    11 @implementation Student
    12 //初始化带有姓名的学生
    13 +(id)initeWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName{
    14     Student *stu=[[[Student alloc] init] autorelease];
    15     stu.firstName=firstName;
    16     stu.lastName=lastName;
    17     return stu;
    18 }
    19 //初始化一个拥有书名且由姓名的学生
    20 +(id)initeWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName andBookName:(NSString *)bookName{
    21     Student *stu=[Student initeWithFirstName:firstName andLastName:lastName];
    22     stu.book=[Book bookWithName:bookName];
    23     return stu;
    24 }
    25 //实现比较方法
    26 -(NSComparisonResult)compareStudent:(Student *)stu{
    27     //先按照姓氏排序
    28     NSComparisonResult *result=[self.lastName compare:stu.lastName];
    29     //如果由相同的姓,则比较名
    30     if(result==NSOrderedSame)
    31     {
    32         result=[self.firstName compare:stu.firstName];
    33     }
    34     return result;
    35 }
    36 //重新实现description方法
    37 -(NSString *)description{
    38     return [NSString stringWithFormat:@"[%@ %@-%@]",self.lastName,self.firstName,self.book.name];
    39 }
    40 -(void)dealloc{
    41     [_firstName release];
    42     [_lastName release];
    43     
    44     [super dealloc];
    45 }
    46 @end

    Book.h

    1 #import <Foundation/Foundation.h>
    2 
    3 @interface Book : NSObject
    4 @property(nonatomic,retain)NSString *name;
    5 +(id)bookWithName:(NSString *)name;
    6 @end

    Book.m

     1 #import "Book.h"
     2 
     3 @implementation Book
     4 //快速创建对象
     5 +(id)bookWithName:(NSString *)name{
     6     Book *book=[[[Book alloc] init] autorelease];
     7     book.name=name;
     8     return book;
     9 }
    10 //释放对象
    11 -(void)dealloc{
    12     [_name release];
    13     [super dealloc];
    14 }
    15 @end

    运行结果

     1 2013-05-14 21:21:22.339 NSArray排序[492:303] 未排序之前的成员顺序是:(
     2     "[ding xiaowei-book1]",
     3     "[li lianjie-book2]",
     4     "[ding xiaolong-book2]",
     5     "[han pengyu-book1]"
     6 )
     7 2013-05-14 21:21:22.345 NSArray排序[492:303] 排序后的成员(先按书名排序,后按照姓名排序):(
     8     "[ding xiaowei-book1]",
     9     "[han pengyu-book1]",
    10     "[ding xiaolong-book2]",
    11     "[li lianjie-book2]"
    12 )
    View Code

    1:首先提供student.h

    //

    #import <Foundation/Foundation.h>

    typedef void (^MySum)(id);

    @interface Student : NSObject

    @property(nonatomic ,retain) NSString * name;

    -(id)InitWithName:(NSString *) Name;//自定义动态构造函数(模仿系统)

    +(id)StudentWithName:(NSString *) Name;//自定义静态构造方法 模仿系统)

    -(void)print;

    -(void)print:(id) msg;

    -(void)Test:(void (^)(id aa)) block ;

    @end

    2:在提供student.m

    //

    //  Student.m

    //  NSArray复习01

    //

    #import "Student.h"

    @implementation Student

    @synthesize name=_name;

    -(id)InitWithName:(NSString *)Name{

        self=[super init];

        if(self){

            self.name=Name;

        }

        return self;

    }

    +(id)StudentWithName:(NSString *)Name{

        return  [[[Student alloc] InitWithName:Name] autorelease];

    }

    -(void)dealloc{

        NSLog(@"Student 对象被销毁%@",self);//此时发送descript方法

        [super dealloc];

    }

    #pragma mark - 重写descript方法

    -(NSString *)description{

        return [NSString stringWithFormat:@"name-->%@",self.name];

    }

    -(void)print{

        NSLog(@"print -->%@",self.name);

    }

    -(void)print:(id)msg{

        NSLog(@"print:--->%@ -->%@",msg,self.name);

    }

    -(void)Test:(void (^)(id))block{//匿名block 对象

    //    MySum MM=block;

    //    MM(@"11");

    //    block=^(id aa){

    //        NSLog(@"%@",self);

    //    };

        block(self.name);

    }

    @end

    3:NSArray的操作

    //

    #import <Foundation/Foundation.h>

    #import "Student.h"

    //NSArray管理对象内存机制 即对象存放到NSArray里面的时候 对象retain一次,当对象从NSArray中移除的时候 对象release一次

    void NSArrayObjectCount(){

        Student *stu1=[Student StudentWithName:@"ABC"];

            NSLog(@"student--->%@,计数器%zi",stu1,[stu1 retainCount]);

        NSArray *arr=[[NSArray alloc] initWithObjects:stu1, nil] ;//第一中创建NSArray方法

        NSLog(@"student--->%@,计数器%zi",stu1,[stu1 retainCount]);

        NSLog(@"before arr release");

        [arr release];

            NSLog(@"after arr release");

        NSLog(@"student--->%@,计数器%zi",stu1,[stu1 retainCount]);

    }

    //创建NSArray的方法 :NSArray是有序的集合,不可变

    void CreateArray(){

        //第一种创建NSSArray 方法

        NSArray *arr1=[[[NSArray alloc] initWithObjects:@"123",@"123",nil] autorelease];//NSArray 里面只能放obejct-c对象,其中nil只是NSArray集合结尾的标识,没有实际意思

        NSLog(@"%@",arr1);

        //第二种创建NSArray方法

        NSArray *arr2=[NSArray arrayWithObjects:@"234",@"345", nil];

        NSLog(@"%@",arr2);

        //第三种创建NSArray 对象,但是只有只有一个集合的NSArray

        NSArray *arr3=[NSArray arrayWithObject:@"123"];

        NSLog(@"%@",arr3);

    }

    //NSArray的查询

    void NSArrayQuery(){

        NSArray *arr=[NSArray arrayWithObjects:@"abc",@"Act",@"AED",@"AFG", nil];

        NSLog(@"%zi",[arr count]);//计算NSArray集合的个数

        NSLog(@"%@",[arr lastObject]);//求NSArray集合种的最后一个元素

        NSLog(@"%@",[arr objectAtIndex:1]);//根据索引得到指定的对象

        NSLog(@"%i",[arr containsObject:@"abc"]);//是否包含某个元素

        NSLog(@"%zi",[arr indexOfObject:@"AED"]);//匹配对象返回对象所在集合的索引

        NSLog(@"%zi",[arr indexOfObject:@"AFG" inRange:NSMakeRange(2, 2)]);

        //集合比较

        NSLog(@"集合");

        NSArray *arr1=[NSArray arrayWithObjects:@"AA",@"Act",@"AED",@"AFG", nil];

        NSLog(@"%zi",[arr1 isEqualToArray:arr]);//比较两个集合是否相同

        NSLog(@"%@",[arr1 firstObjectCommonWithArray:arr]);//返回两个集合种第一个相同的对象

    }

    //给NSArray发送消息

    void NSArraySend(){

        Student *stu1=[Student StudentWithName:@"JACK"];

         Student *stu2=[Student StudentWithName:@"Mike"];

        NSArray *arr=[NSArray arrayWithObjects:stu1,stu2, nil];

        [arr makeObjectsPerformSelector:@selector(print)];//让集合中的每个对象执行print 方法

        [arr makeObjectsPerformSelector:@selector(print:) withObject:@"Good"];

    }

    //第一种排序:经典for循环

    void ArrayFor1(){

            NSArray *arr=[NSArray arrayWithObjects:@"AA",@"Act",@"AED",@"AFG", nil];

       NSUInteger count= [arr count];

        for(int i=0;i<count;i++){

            id obj=[arr objectAtIndex:i ];

            NSLog(@"index=%i,%@",i,obj);

        }

    }

    //第二种排序:c#种foreach

    void ArrayFor2(){

        NSArray *arr=[NSArray arrayWithObjects:@"AA",@"Act",@"AED",@"AFG", nil];

        for( id obj in arr){

            NSLog(@"%@",obj);

        }

    }

    //第三种排序:迭代器

    void ArrayFor3(){

        NSArray *arr=[NSArray arrayWithObjects:@"AA",@"Act",@"AED",@"AFG", nil];

        id obj=nil;

        NSEnumerator *enumerator= [arr objectEnumerator];//得到集合的迭代器

        while(obj=[enumerator nextObject])

        {

            NSLog(@"%@",obj);

        }

    }

    //第4中排序:迭代器(1)倒序迭代器

    void ArrayFor4(){

        NSArray *arr=[NSArray arrayWithObjects:@"AA",@"Act",@"AED",@"AFG", nil];

        id obj=nil;

        NSEnumerator *enumerator=[arr reverseObjectEnumerator];//得到集合的倒序迭代器

        while(obj=[enumerator nextObject]){

            NSLog(@"%@",obj);

        }

    }

    //第5种排序 ^block

    void ArrayFor5(){

        NSArray *arr=[NSArray arrayWithObjects:@"AA",@"Act",@"AED",@"AFG", nil];

    //    [arr enumerateObjectsUsingBlock:<#^(id obj, NSUInteger idx, BOOL *stop)block#>]

        [arr enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop){

            NSLog(@"%@",obj);

        }];

    }

    int main(int argc, const char * argv[])

    {

        @autoreleasepool {

            Student *STU=[Student StudentWithName:@"MIKE"];

            [STU Test:^(id str){

                NSLog(@"%@",str);//blcok的机

            }];

           // ArrayFor4();

        }

        return 0;

    }

    NSArray其他函数的操作

    //NSArray中的迭代器

    void Enumerator(){

            NSArray *arr=[NSArray arrayWithObjects:@"123",@"234",@"567", nil];

        NSEnumerator * Enumerator= [arr  objectEnumerator];//得到集合的迭代器

          NSLog(@"%@",[Enumerator nextObject]);//获取迭代器的下一个元素

       NSLog(@"%@",[Enumerator allObjects]);//通过迭代器获取NSArray的元素

    }

    //NSArray中派生出来新的类

    void MustArray(){

          NSArray *arr=[NSArray arrayWithObjects:@"123",@"234",@"567", nil];//arr指向的数组是不可变的。

        NSArray *arr1=[arr arrayByAddingObject:@"ABC"];//添加一个元素返回新的元素,arr元素没有变化(笔者猜测里面是用指针操作)

        NSLog(@"%@",arr1);

        NSArray *arr2=[NSArray arrayWithObjects:@"AC",@"AD",@"AE", nil];//arr2指向的数组是不可变的。

        NSArray *arr3=[arr2 arrayByAddingObjectsFromArray:arr];//添加一个数组,返回新的数组

        NSLog(@"%@",arr3);

        NSArray *arr4=[arr2 subarrayWithRange:NSMakeRange(1, 2)];

        NSLog(@"%@",arr4);

    }

    //NSArray的其他操作

    void otherArray(){

    NSArray *arr2=[NSArray arrayWithObjects:@"AC",@"AD",@"AE", nil];//arr2指向的数组是不可变的。

        NSString *str=[arr2 componentsJoinedByString:@"-"];//将一个NSArray已“-”分割符号拼接成一个字符串

        NSLog(@"%@",str);

    }

    int main(int argc, const char * argv[])

    {

        @autoreleasepool {

    //        Enumerator();

            //MustArray();

            otherArray();

        }

        return 0;

    }

  • 相关阅读:
    对称加密算法:替代算法与置换算法
    cin与getline
    延迟任务实现方式
    @Validated校验
    mac 终端 常用命令
    IOS和Android的区别[转]
    [IOS] NSIndexPath , NSIndexSet , NSRange 之间的区别比较
    [IOS]iphone开发之UIImage应用与内存管理,UIImage加载图像方法
    CorePlot SDK的安装以及应用
    [IOS] iphone 之 横屏和自动旋转
  • 原文地址:https://www.cnblogs.com/dingxiaowei/p/3078840.html
Copyright © 2011-2022 走看看