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 )
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;
}