ios学习第二天(四)对象之容器NSArray,NSSet,NSDictionary和它们的子类

容器在开发中很有用,帮助我们很方便的在内存中对数据进行增删改查这样的操作。需要特别注意的是:容器只能存放对象

ios中容器分为不可变容器和可变容器:

    不可变容器有NSArray,NSSet和NSDictionary。

    可变容器有NSMutableArray,NSMutableSet和NSMutableDictionary。

可变的意思是长度可变,元素可变。不可变的容器,创建时什么样销毁前还是什么样,不能对其内容进行修改。

可变容器是不可变容器的子类,一般情况下,子类的功能是强于父类的。

不喜欢不可变的,太没意思了,直接开始研究可变容器:

1.NSMutableArray

数组(NSMutableArray)是一种线性表,感觉oc中是采用数组(C语言中的数组概念)来实现的,可以放入相同的对象。在任意位置插入元素,修改任意位置元素,删除任意位置元素。查找元素是否在数组中。但是值得注意的是,在非结尾插入,删除效率并不高。查找元素效率也不高。尽可能避免大量的这种操作。

常用方法:

添加元素

[mArray addObject:@1];//添加元素,添加到结尾

[mArray addObjectsFromArray:array];//添加一批元素

[mArray insertObject:@2 atIndex:1];//在下标1的地方插入2,其余元素会依次向后移动,数组长度加1

删除元素

[mArray removeObject:@1];//删除首先出现的值为1的对象

[mArray removeObjectAtIndex:1];//删除下标为1的元素

[mArray removeAllObjects];//删除全部元素

修改元素

[mArray replaceObjectAtIndex:1 withObject:@4];//替换下标1的位置元素,换成4

查找元素

[mArray firstObject];//获取第一个元素

[mArray objectAtIndex:1];//获取下标为1的元素

[mArray lastObject];获取最后一个元素

[mArray containsObject:@1];判断是否包含元素1

求长度

[mArray count];

遍历:

for(id obj in mArray ){
      NSLog(@"%@",obj);
}



2.NSMutableSet

集合是数学中一个重要的概念,里面存放的元素互不相同。根据对代码的测试,发现插入一些数据后,遍历结果并不是顺序输出,可以推断出oc中Set实现方法是Hash。它的特点是查找快,插入快,删除快,存放对象唯一,元素无序。缺点也是有的,占用较大的内存空间。当元素个数达到临界值后,会进行扩容和重散列,这是速度是慢的。在java中Set有TreeSet和HashSet。TreeSet,插入,删除,查找效率都比Hash的慢,但是占用空间小,不需要重散列,扩容时代价也小,当集合中元素个数少的时候,效率还是很不错的。

常用方法:


[mSet count];//长度
[mSet addObject:@6];//添加元素

[mSet removeObject:@1];//删除元素

[mSet containsObject:@2];//是否包含元素

遍历:

for(id obj in mSet){
      NSLog(@"%@",obj);//1 6 2 20 1009
}


3.NSMutableDictionary

字典用来存放键值对,一个key对应到一个value。相当与java中的Map,更确切的说是HashMap,实现方式是Hash表,和Set类似,不同的是,这里存放的是key和value。优缺点也一样。

创建

NSMutableDictionary *mDictionary=[NSMutableDictionary dictionaryWithCapacity:30];

插入

[mDictionary setObject:@"张三" forKey:@"name"];


获取键值对个数

[mDictionary count];


查询

通过key获取value
[mDictionary objectForKey:@"name"];


删除

通过key移除所对应的value
[mDictionary removeObjectForKey:@"name"];

删除全部
[mDictionary removeAllObjects];
    

遍历

遍历1
    NSArray *arr=[mDictionary allKeys];
    for(id obj in arr){
        NSLog(@"%@",[mDictionary objectForKey:obj]);
    }
遍历2
    NSEnumerator * enumerator = [mDictionary keyEnumerator];
    for(id obj in enumerator){
        NSLog(@"%@",[mDictionary objectForKey:obj]);
    }
    

这一篇花了好长时间,本来打算只简单介绍一下NSArray的,其余两个就不介绍了,没忍住,写了一下

看代码吧:

//
//  main.m
//  HelloWorld
//
//  Created by Moluth on 17/4/6.
//  Copyright (c) 2017年 Moluth. All rights reserved.
//


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[]) {
    //不可变容器
    NSArray *array;//数组
    NSSet *set;//集合
    NSDictionary *dictionary;//字典
    
    NSObject *o;
    
    //可变容器,分别是以上三个类的子类
    NSMutableArray *mArray=[[NSMutableArray alloc] initWithCapacity:3];//可变数组期望长度是3,这个值应该尽可能的略大于与之后最长长度
    NSMutableSet *mSet=[[NSMutableSet alloc] initWithCapacity:10];//可变集合
    NSMutableDictionary *mDictionary=[NSMutableDictionary dictionaryWithCapacity:30];//可变字典
    
    数组/
    
    [mArray addObject:@1];//添加元素,添加到结尾
    [mArray addObject:@2];
    NSLog(@"%ld",[mArray count]);//2
    [mArray addObject:@3];
    [mArray addObject:@4];
    NSLog(@"%ld",[mArray count]);//4
    
    NSLog(@"%@",[mArray firstObject]);//1
    NSLog(@"%@",[mArray objectAtIndex:1]);//2
    NSLog(@"%@",[mArray lastObject]);//4
    
    for(id obj in mArray){
        NSLog(@"%@",obj);//1 2 3 4
    }
    
    [mArray removeObjectAtIndex:1];//删除下标为1的元素
    
    for(id obj in mArray){
        NSLog(@"%@",obj);//1 3 4
    }
    
    [mArray insertObject:@2 atIndex:1];//在下标1的地方插入2,其余元素会依次向后移动,数组长度加1
    for(id obj in mArray){
        NSLog(@"%@",obj);//1 2 3 4
    }

    [mArray replaceObjectAtIndex:1 withObject:@4];//替换下标1的位置元素,换成4
    for(id obj in mArray){
        NSLog(@"%@",obj);//1 4 3 4
    }
    
    NSLog(@"%d",[mArray containsObject:@1]);//1 是否包含对象
    [mArray removeAllObjects];//删除全部元素
    NSLog(@"%d",[mArray containsObject:@1]);//0
    
    //集合
    [mSet addObject:@1];
    NSLog(@"%ld",[mSet count]);//1
    [mSet addObject:@1];
    NSLog(@"%ld",[mSet count]);//1
    [mSet addObject:@2];
    NSLog(@"%ld",[mSet count]);//2
    [mSet addObject:@1009];
    [mSet addObject:@20];
    [mSet addObject:@6];
    for(id obj in mSet){
        NSLog(@"%@",obj);//1 6 2 20 1009
    }
    [mSet removeObject:@1];
    [mSet containsObject:@2];
    
    //字典
    
    [mDictionary setObject:@"张三" forKey:@"name"];
    [mDictionary count];
    [mDictionary objectForKey:@"name"];
    [mDictionary removeObjectForKey:@"name"];
    [mDictionary removeAllObjects];
    
    [mDictionary setObject:@"张三" forKey:@"name"];
    [mDictionary setObject:@"1111" forKey:@"age"];
    
    
    //遍历1
    NSArray *arr=[mDictionary allKeys];
    for(id obj in arr){
        NSLog(@"%@",[mDictionary objectForKey:obj]);
    }
    //遍历2
    NSEnumerator * enumerator = [mDictionary keyEnumerator];
    for(id obj in enumerator){
        NSLog(@"%@",[mDictionary objectForKey:obj]);
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值