//删除数组

[areaArr removeAllObjects];

[industryArr removeAllObjects];

[natureArr removeAllObjects];


用NSMutableDictionary来保存“名片”记录。那么这一次,我们扩展,并使用NSMutableArray来保存“菜单”信息。

那么,我们将在AddressBook类中加入相关的属性。

AddressBook.h 文件中加入:

NSMutableArray *_bookArray;

@property(nonatomic,copy) NSMutableArray *bookArray;

在AddressBook.m 文件中加入:

@synthesize bookArray=_bookArray;生成相应的get,set方法。

修改响应初始化的方法来完成初始化:

- (id)initWithName:(NSString *)name{

self=[super init];

if (self) {

_bookName=[[NSString alloc] initWithString:name];

_bookArray=[[NSMutableArray alloc] init];

_bookDictionary=[[NSMutableDictionary alloc] init];

}

return self;


}


下面,就开始响应的NSMutableArray类的操作。

加入元素到NSMutableArray中:

- (void)addCardForArray:(AddressCard *)newCard{

[_bookArray addObject:newCard];


}

使用时:

NSString*aName=[[NSStringalloc]initWithString:@"Tom"];

NSString*aEmail=[[NSStringalloc]initWithString:@"Tom@yahoo.cn"];

intaSalary=1000;

NSString*bName=[[NSStringalloc]initWithString:@"LiLei"];

NSString*bEmail=[[NSStringalloc]initWithString:@"LiLei@yahoo.cn"];

intbSalary=1100;

NSString*cName=[[NSStringalloc]initWithString:@"Lucy"];

NSString*cEmail=[[NSStringalloc]initWithString:@"Lucy@yahoo.cn"];

intcSalary=900;

NSString*dName=[[NSStringalloc]initWithString:@"HanMeimei"];

NSString*dEmail=[[NSStringalloc]initWithString:@"HanMeimei@yahoo.cn"];

intdSalary=1300;

AddressCard*card1=[[AddressCardalloc]init];

AddressCard*card2=[[AddressCardalloc]init];

AddressCard*card3=[[AddressCardalloc]init];

AddressCard*card4=[[AddressCardalloc]init];

[card1setName:aNameandEmail:aEmailandSalary:aSalary];

[card2setName:bNameandEmail:bEmailandSalary:bSalary];

[card3setName:cNameandEmail:cEmailandSalary:cSalary];

[card4setName:dNameandEmail:dEmailandSalary:dSalary];

AddressBook *myBook=[[AddressBook alloc] init];

[myBook initWithName:@"MyBook"];

[myBook addCardForArray:card1];// 添加元素

[myBook addCardForArray:card2];

[myBook addCardForArray:card3];

[myBook addCardForArray:card4];


遍历NSMutableArray中的元素:

- (void)printBookForArray{

for (AddressCard *theCard in _bookArray) {

[theCard print];

}


}

使用时:

[myBook printBookForArray];// 输出元素


查询NSMutableArray中的元素:

- (AddressCard *)findCardForArray:(NSString *)theName{

for (AddressCard *theCard in _bookArray) {

if ([[theCard name] caseInsensitiveCompare:theName]==NSOrderedSame) {

return theCard;

}

}

return Nil;


}

使用时:

AddressCard *theCard= [myBook findCardForArray:@"Tom"];// 查找

if (theCard!=Nil) {

[theCard print];

}else{

NSLog(@"No have");

}


删除NSMutableArray中的元素(一):


- (void)removeCardForArray:(AddressCard *)theCard{

[_bookArray removeObjectIdenticalTo:theCard];


}


使用时:先查找,再删除

AddressCard *theCard= [myBook findCardForArray:@"Tom"];// 查找

if (theCard!=Nil) {

[myBookremoveCardForArray:theCard];//删除元素

}else{

NSLog(@"No have");

}

用这个方法,删除的对象为同一对象。

什么时同一对象?方法备注中已经说明。

所以,用removeObjectIdenticalTo方法,无法删除那些,属性值都相同,但是占有不同空间的对象。

不信,可以亲自试一试!

[myBook printBookForArray];// 输出元素

AddressCard *removedCard=[[AddressCard alloc] init];

// 申明一个新的Card对象,该对象与card1,具有相同的值,但是占有不同的内存

[removedCard setName:aName andEmail:aEmail andSalary:aSalary];

[myBook removeCardForArray:removedCard];// 删除元素

[myBook printBookForArray];// 输出元素


通过,输出可以说明,并没有删除啊!

那我们要问?我只需要属性值相等,就可以删除。怎么办?

那就开始下边的操作把!


删除NSMutableArray中的元素(二):

- (void)removeCardByisEqualForArray:(AddressCard *)theCard{

[_bookArray removeObject:theCard];


}


方法中提到,要重载isEqual方法。

因为我们要进行比较的元素是AddressCard;所以,在AddressCard类中重载isEqual方法:

- (BOOL)isEqual:(AddressCard *)theCard{

if ([_name isEqualToString:theCard.name]==YES &&

[_email isEqualToString:theCard.email]==YES) {

return YES;

}else{

return NO;

}


}


使用时:

[myBook removeCardByisEqualForArray:removedCard];// 删除元素


首先,调用AddressCard类中重载isEqual方法,比较元素是否相等;相等则会删除;否则不删除。


顺便提及一下:

containsObject方法和indexOfObject方法都是通过isEqual方法的比较结果来进行查找的。这两个方法,就不详细说明了。


NSMutableArray中元素的排序:


- (void) sortBySalarysForArray{

[_bookArray sortUsingSelector:@selector(compareBySalary:)];

}


在AddressCard类中,编写compareBySalary方法

- (NSComparisonResult) compareBySalary:(id)element{

if (salary>[element salary]) {

return NSOrderedDescending;

}else if (salary<[element salary]) {

return NSOrderedAscending;

}else{

return NSOrderedSame;

}

}