iOS关于数组的那些小菜菜

简介:

  



//删除数组

    [areaArr removeAllObjects];

    [industryArr removeAllObjects];

    [natureArr removeAllObjects];


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

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

AddressBook.h 文件中加入:

NSMutableArray *_bookArray;

 

@property(nonatomic,copy) NSMutableArray *bookArray;

AddressBook.m 文件中加入:

@synthesize bookArray=_bookArray;生成相应的getset方法。

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

 

 

- (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=[[NSString alloc] initWithString:@"Tom"];

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

    int aSalary=1000;

    

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

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

    int bSalary=1100;

    

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

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

    int cSalary=900;

    

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

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

    int dSalary=1300;

    

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

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

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

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

    

    

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

    [card2 setName:bName andEmail:bEmail andSalary:bSalary];

    [card3 setName:cName andEmail:cEmail andSalary:cSalary];

    [card4 setName:dName andEmail:dEmail andSalary: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) {

        [myBook removeCardForArray: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;

    }

}










本文转自 卓行天下  51CTO博客,原文链接:http://blog.51cto.com/9951038/1754231,如需转载请自行联系原作者
目录
相关文章
|
iOS开发
iOS 查询数组中的对象
iOS 查询数组中的对象
184 0
|
安全 iOS开发
iOS开发 - 字面语法之数组注意事项
iOS开发 - 字面语法之数组注意事项
113 0
|
存储 机器学习/深度学习 缓存
iOS - 链表、数组区别及常见算法
iOS - 链表、数组区别及常见算法
|
Web App开发 C语言 iOS开发
【IOS 开发】Object - C 数组使用详解(二)
【IOS 开发】Object - C 数组使用详解(二)
159 0
|
iOS开发 索引
【IOS 开发】Object - C 数组使用详解(一)
【IOS 开发】Object - C 数组使用详解(一)
429 0
|
iOS开发
iOS post提交数据有嵌套数组的处理方法
2017年11月21日17:11:43 解决办法, 修改iOS框架里的代码: http://www.jianshu.com/p/130daa0c2fe7 确实有效, 要不然,  内层的每一个键值对都会变成一个单独的dic, 这样原来的两层就变成了3层:     ===>
1201 0
|
自然语言处理 iOS开发 索引
|
存储 iOS开发 容器
iOS - OC NSArray 数组
前言 @interface NSArray : NSObject @interface NSMutableArray : NSArray 数组只能存储 OC 对象,不能存储 C 语言中的基本数据类型,也不能存储 nil 。
1003 0