集合類型

認識數(shù)組
1)數(shù)組是一個有序的元素序列,支持隨機存儲傲隶。索引從0開始,索引訪問越界會拋出運行時異常窃页。注意與C語言數(shù)組不同跺株。
----------------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的子類:
*如為基本數(shù)據(jù)類型畦木,需要用NSNumber封裝為對象類型后袖扛,才能放入數(shù)組里面。
*如果為C語言結構類型十籍,需要用NSValue封裝為對象類型后蛆封,才能放入數(shù)組中。
*數(shù)組元素可以是不同對象類型妓雾,可能會有類型不安全娶吞。(取值的時候不清楚是什么類型)
//----------------數(shù)組元素-------------

 NSString *text=@"Panda";//字符串對象
    NSInteger number=100;//不是對象 是從新定義后的整數(shù) 基于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具有常量性:長度和元素指針都不能更改。但指針指向的對象內部可以更改械姻。
//----------------數(shù)組的常量性-------------

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

數(shù)組的常用操作:
//----------------數(shù)組的遍歷-------------
最快-Fast Enumeration绣夺,直接訪問內存吏奸,優(yōu)化索引檢查,快5-10倍 建議用這種

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

較慢-NSEnumerator遍歷 索引檢查+動態(tài)消息調用

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

最慢-For循環(huán)訪問:索引檢查+動態(tài)消息調用

//for循環(huán)
    for (int i=0; i<array5.count; i++) {
        NSLog(@"array5[%d],%@",i,array5[i]);//訪問索引
    }

數(shù)組查找
1)indexofobject查找是否存在“值相等”的對象(類型需要實現(xiàn)isEqual)
2)indexofobjectIdenticalTo 查找是否存在“指針相等”的對象

//數(shù)組查找
    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);
  
}

數(shù)組排序
不改變原數(shù)組(常量性)陶耍,返回新數(shù)組

 //數(shù)組排序 字母排序 不更改里面的內容 取返回值給新的數(shù)組
    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支持更改數(shù)組長度和元素指針奋蔚。為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,一般大于實際元素數(shù)量泊碑,當長度增長時,如實際需求大于capacity會以近似2倍的方法指數(shù)增長毯欣。伴隨代價:
分配新的堆內存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操作酗钞,因為會改變數(shù)組元素序列腹忽,涉及大量內存拷貝操作,代價高砚作。前移后移的操作窘奏。
認識NSSet集合(無序)
NSSet是一個無序的集合,其存儲的對象不能重復葫录。
NSSet被定義為class着裹,引用類型,拷貝時具有引用語義压昼。
常量集合NSSet求冷,可變集合:NSMutableSet:
常量性:長度和指針元素都不能更改。但指針指向的對象內部可以更改窍霞。
創(chuàng)建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:
常量性:長度和指針元素都不能更改。但指針指向的對象內部可以更改年柠。
創(chuàng)建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);
    
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市答憔,隨后出現(xiàn)的幾起案子味赃,更是在濱河造成了極大的恐慌,老刑警劉巖虐拓,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件心俗,死亡現(xiàn)場離奇詭異,居然都是意外死亡蓉驹,警方通過查閱死者的電腦和手機城榛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來态兴,“玉大人狠持,你說我怎么就攤上這事∈ィ” “怎么了工坊?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敢订。 經(jīng)常有香客問我王污,道長,這世上最難降的妖魔是什么楚午? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任昭齐,我火速辦了婚禮,結果婚禮上矾柜,老公的妹妹穿的比我還像新娘阱驾。我一直安慰自己,他們只是感情好怪蔑,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布里覆。 她就那樣靜靜地躺著,像睡著了一般缆瓣。 火紅的嫁衣襯著肌膚如雪辩撑。 梳的紋絲不亂的頭發(fā)上咕宿,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天对室,我揣著相機與錄音拉宗,去河邊找鬼。 笑死渡冻,一個胖子當著我的面吹牛戚扳,可吹牛的內容都是我干的。 我是一名探鬼主播族吻,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼帽借,長吁一口氣:“原來是場噩夢啊……” “哼珠增!你這毒婦竟也來了?” 一聲冷哼從身側響起宜雀,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤切平,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辐董,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悴品,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年简烘,在試婚紗的時候發(fā)現(xiàn)自己被綠了苔严。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡孤澎,死狀恐怖届氢,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情覆旭,我是刑警寧澤退子,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站型将,受9級特大地震影響寂祥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜七兜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一丸凭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腕铸,春花似錦惜犀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涛菠,卻和暖如春浓恳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碗暗。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梢夯,地道東北人言疗。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像颂砸,于是被迫代替她去往敵國和親噪奄。 傳聞我的和親對象是個殘疾皇子死姚,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容