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;

}

原文地址:https://www.cnblogs.com/dingxiaowei/p/3078840.html