集合类型

认识数组
1)数组是一个有序的元素序列,支持随机存储。索引从0开始,索引访问越界会抛出运行时异常。注意与C语言数组不同。
----------------NSArray初始化------------

    //工厂方法 最后放nil 表示结束 它不是元素
    NSArray *array1=[NSArray arrayWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];
    //内存分配alloc+init初始化
    NSArray *array2=[[NSArray alloc] initWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];
    //使用字面常量 不需要Nil
    NSArray *array3=@[@"Shanghai",@"Beijing",@"New York",@"Paris"];
    
    NSLog(@"array1 count: %lu" ,array1.count);//4
    NSLog(@"array2 count: %lu" ,array2.count);//4
    NSLog(@"array3 count: %lu" ,array3.count);//4
    NSLog(@"array1: %@" ,array1);//按字符串方式打印出来

2)NSArray被定义为class,引用类型,拷贝时具有引用语义。
3)NSArray的元素必须是对象,即NSObject的子类:
*如为基本数据类型,需要用NSNumber封装为对象类型后,才能放入数组里面。
*如果为C语言结构类型,需要用NSValue封装为对象类型后,才能放入数组中。
*数组元素可以是不同对象类型,可能会有类型不安全。(取值的时候不清楚是什么类型)
//----------------数组元素-------------

 NSString *text=@"Panda";//字符串对象
    NSInteger number=100;//不是对象 是从新定义后的整数 基于cpu架构 还是值类型
    NSNumber *numberObject1=
        [NSNumber numberWithInteger:number ];//使用NSNumber将NSInteger包装为对象
    NSNumber *numberObject2=@300u;//使用字面常量初始化
    Point point;//结构类型也不行 需要使用NSValue将struct包装为对象 编码方式将Point写进去
    point.h=100;
    point.v=200;
    NSValue *pointObject=
        [NSValue value:&point withObjCType:@encode(Point)];//使用NSValue将struct包装为对象
    NSNull* nullValue=[NSNull null];
    NSArray *array4=@[text, numberObject1,numberObject2,pointObject, nullValue];
    NSLog(@"array4: %@" ,array4);

4)NSArray具有常量性:长度和元素指针都不能更改。但指针指向的对象内部可以更改。
//----------------数组的常量性-------------

BLNPoint *p1=[[BLNPoint alloc] initWithX:10 WithY:20];
BLNPoint *p2=[[BLNPoint alloc] initWithX:20 WithY:40];
BLNPoint *p3=[[BLNPoint alloc] initWithX:30 WithY:60];
BLNPoint *p4=[[BLNPoint alloc] initWithX:40 WithY:80];
    
NSArray *array5=@[p1,p2,p3,p4];
    
NSLog(@"array5: %@", array5);
    
BLNPoint *p5=[[BLNPoint alloc] initWithX:50 WithY:100];
    
//1. 更改元素长度-----不可以!
//[array5 addObject:p5];
    
//2. 更改元素指针-----不可以!
//array5[0]=p5;
    
//3. 更改指针指向的内容-----可以!
    for(int i=0;i<array5.count;i++){
        BLNPoint *pt= array5[i];//取出每个元素
        pt.x++;//将指针里面指向的内容更改
        pt.y++;
    }
    NSLog(@"array5: %@", array5);

数组的常用操作:
//----------------数组的遍历-------------
最快-Fast Enumeration,直接访问内存,优化索引检查,快5-10倍 建议用这种

//快速枚举 如果不知道类型 用id 或者 object
    for ( BLNPoint* point in array5)
    {
        point.x++;
        point.y++;
    }

较慢-NSEnumerator遍历 索引检查+动态消息调用

//迭代器模式
    NSEnumerator *enumerator = [array5 objectEnumerator];
    BLNPoint* item;
    while (item = [enumerator nextObject])//消息分发
    {
        item.x++;
        item.y++;
    }

最慢-For循环访问:索引检查+动态消息调用

//for循环
    for (int i=0; i<array5.count; i++) {
        NSLog(@"array5[%d],%@",i,array5[i]);//访问索引
    }

数组查找
1)indexofobject查找是否存在“值相等”的对象(类型需要实现isEqual)
2)indexofobjectIdenticalTo 查找是否存在“指针相等”的对象

//数组查找
    BLNPoint* target=[[BLNPoint alloc] initWithX:33 WithY:63];
    NSUInteger index1=[array5 indexOfObject:target];//查找值是否相等
    NSUInteger index2=[array5 indexOfObjectIdenticalTo:p3];//指针引用是否相等
    
    NSLog(@"find at %lu", index1);//find at 2
    NSLog(@"find at %lu", index2);//find at 2

在进行查找值是否相等的时候 需要写这个方法:

- (BOOL)isEqual:(id)anObject{
    
    if (! [anObject isKindOfClass: [BLNPoint class]] ){
        return false;
    }
    
    BLNPoint* other=anObject;
    return (self.x==other.x && self.y==other.y);
  
}

数组排序
不改变原数组(常量性),返回新数组

 //数组排序 字母排序 不更改里面的内容 取返回值给新的数组
    NSArray* sortArray1=[array1 sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"array1: %@" ,array1);
    NSLog(@"sortArray1: %@" ,sortArray1);
结果:
array1: (
    Shanghai,
    Beijing,
    "New York",
    Paris
)
sortArray1: (
    Beijing,
    "New York",
    Paris,
    Shanghai
)

使用NSMutableArray
NSMutableArray支持更改数组长度和元素指针。为NSArray的子类。

//初始化
    NSMutableArray   *muArray1=[NSMutableArray arrayWithObjects:p1,p2,p3,p4, nil];
    
    NSLog(@"before change, muArray1: %@",muArray1);
    
    BLNPoint *p6=[[BLNPoint alloc] initWithX:60 WithY:120];
    BLNPoint *p7=[[BLNPoint alloc] initWithX:70 WithY:140];
    
    //修改元素
    [muArray1 addObject:p5];//增加一个元素
    [muArray1 removeObjectAtIndex:2];//将p3元素删除
    [muArray1 insertObject:p6 atIndex:1];//在1位置上插入p6
    muArray1[0]=p7;  //[muArray1 setObject:p7 atIndexedSubscript:0];
    NSLog(@"after change, muArray1: %@",muArray1);

NSMutableArray初始化后,会分配一个缓存容量capacity,一般大于实际元素数量,当长度增长时,如实际需求大于capacity会以近似2倍的方法指数增长。伴随代价:
分配新的堆内存2capacity
*将原来堆内存上的元素拷贝到新的内存
*释放原来的堆内存

 //预估容量
    int count=100;
    NSMutableArray *muArray2=[NSMutableArray arrayWithCapacity:10];
    
    for (int i=0; i< count; i++) {
        BLNPoint *pt=[[BLNPoint alloc] initWithX:i*10 WithY:i*20];
        [muArray2 addObject: pt];
    }

最佳实践:估计好capacity,预先分配一定容量,避免以后增长。
尽量避免使用insertObject:atIndex:和removeObjectAtIndex操作,因为会改变数组元素序列,涉及大量内存拷贝操作,代价高。前移后移的操作。
认识NSSet集合(无序)
NSSet是一个无序的集合,其存储的对象不能重复。
NSSet被定义为class,引用类型,拷贝时具有引用语义。
常量集合NSSet,可变集合:NSMutableSet:
常量性:长度和指针元素都不能更改。但指针指向的对象内部可以更改。
创建NSMutableSet时用initwithcapacity提前设置capacity
支持Fast Enumeration和NSEnumerator变量,前者较快。

void setDemo()
{
    
    //---------------- NSSet 与 NSMutableSet-------------
    //初始化
    NSSet *set1 =
        [NSSet setWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];
    NSLog(@"set1 count: %lu", set1.count);
    
    NSMutableSet *set2 =
        [NSMutableSet setWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];

    [set2 addObject:@"London"];
    [set2 addObject:@"Paris"];
    [set2 removeObject:@"Beijing"];
    NSLog(@"set2 count: %lu", set2.count);
    
    //判断是否包含某个对象
    if([set2 containsObject:@"Shanghai"])
    {
        NSLog(@"set2 contains Shanghai");
    }
    //遍历
    for(NSString* item in set2)
    {
        NSLog(@"%@", item);
    }

}

认识字典NSDictionary
NSDictionary是一个存储key-value的无序集合,key唯一,value可重复。
NSDictionary被定义为class,引用类型,拷贝时具有引用语义。
常量集合NSDictionary,可变集合:NSMutableDictionary:
常量性:长度和指针元素都不能更改。但指针指向的对象内部可以更改。
创建NSMutableDictionary时用initwithcapacity提前设置capacity
支持Fast Enumeration和NSEnumerator变量,前者较快。

void dictionaryDemo()
{
    //---------------- NSDictionary 与 NSMutableDictionary-------------
    
    BLNPoint *p1=[[BLNPoint alloc] initWithX:10 WithY:20];
    BLNPoint *p2=[[BLNPoint alloc] initWithX:20 WithY:40];
    BLNPoint *p3=[[BLNPoint alloc] initWithX:30 WithY:60];
    BLNPoint *p4=[[BLNPoint alloc] initWithX:40 WithY:80];
    BLNPoint *p5=[[BLNPoint alloc] initWithX:50 WithY:100];
    
    //@{key:value}
    NSDictionary *dictionary1 = @{
                                  @"Shanghai" : p1,
                                  @"Beijing" : p2,
                                  @"New York" : p3,
                                  @"Paris" : p4};
    //[value,key ,nil结束]
    NSMutableDictionary *dictionary2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                p1,@"Shanghai",
                                p2,@"Beijing",
                                p3,@"New York",
                                p4,@"Paris",
                                nil];
    
   
    NSLog(@"dictionary1 count: %lu", dictionary1.count);
    NSLog(@"dictionary2 count: %lu", dictionary2.count);
    
    BLNPoint* result1=[dictionary1 objectForKey:@"Beijing"];//查value是什么
    BLNPoint* result2=dictionary1[@"Shanghai"];
    NSLog(@"%@", result1);
    NSLog(@"%@", result2);
    
    for(NSString* key in dictionary1)
    {
        id object=dictionary1[key];
        NSLog(@"key:%@, object:%@", key, object);
    }
    
    
    [dictionary2 setObject:p5 forKey:@"London"];
    [dictionary2 removeObjectForKey:@"Shanghai"];
    NSLog(@"dictionary2: %@", dictionary2);
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容