Objective-c 语法之集合NSDictionary & NSSet & NSArray

1、不可变词典 NSDictionary 的主要用法

[ NSDictionary dictionaryWithobjectsAndKeys:....]: 使用键值对直接创建词典对象,结尾必须使用nil 标志结束。

[ dictionary count]: 得到词典的键值对数量. 

[ dictionary keyEnumerator] :将词典的所有key储存在NSEnumerator 中, 类似于java中的迭代器

[ dictionary objectEnumeration ]:将词典的所有value 储存在NSEnumerator 中

[ dictionary objectForKey ]: 通过传入key对象可以拿到当前key对应储存的值

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"25",@"age",@"张三",@"name",@"男",@"性别",nil];
        NSLog(@"%lu", [dictionary count]);
        NSEnumerator *enumeratorKey = [dictionary keyEnumerator];
        for (NSObject *object in enumeratorKey) {
            NSLog(@"key:%@", object);
        }
        
        NSEnumerator *enumeratorObject = [dictionary objectEnumerator];
        for (NSObject *object in enumeratorObject) {
            NSLog(@"value:%@", object);
        }
        NSLog(@"key name的值是:%@", [dictionary objectForKey:@"name"]);
        
    }
    return 0;
}

打印结果

2012-07-09 16:31:18.276 objectiveC[2965:403] 3
2012-07-09 16:31:18.282 objectiveC[2965:403] key:age
2012-07-09 16:31:18.282 objectiveC[2965:403] key:name
2012-07-09 16:31:18.283 objectiveC[2965:403] key:性别
2012-07-09 16:31:18.283 objectiveC[2965:403] value:25
2012-07-09 16:31:18.284 objectiveC[2965:403] value:张三
2012-07-09 16:31:18.284 objectiveC[2965:403] value:男
2012-07-09 16:31:18.285 objectiveC[2965:403] key name的值是:张三

2、可变的词典NSMutableDictionary

NSMutableDictionary是NSDictionary的子类。所以继承了NSDictionary 的方法,以上的代码对NSMutableDictionary来说完全可用,我们可以试试不一样的地方增删键值数据

[ dictionary setObject:forkey: ] :向可变的词典动态的添加数据

[ dictionary removeAllObjects..]: 删除掉词典中的所有数据

[ dictionary removeObjectForkey ...] : 删除掉词典中指定key的数据

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"25",@"age",@"张三",@"name",@"男",@"性别",nil];
        [dictionary setObject:@"30名" forKey:@"名次"];
        
        NSLog(@"%lu", [dictionary count]);
        NSEnumerator *enumeratorKey = [dictionary keyEnumerator];
        for (NSObject *object in enumeratorKey) {
            NSLog(@"key:%@", object);
        }
        
        NSEnumerator *enumeratorObject = [dictionary objectEnumerator];
        for (NSObject *object in enumeratorObject) {
            NSLog(@"value:%@", object);
        }
        NSLog(@"key 名次的值是:%@", [dictionary objectForKey:@"名次"]);
        [dictionary removeObjectForKey:@"名词"];
        NSLog(@"%lu", [dictionary count]);
    }
    return 0;
}

打印结果

2012-07-09 16:37:07.037 objectiveC[3053:403] 4
2012-07-09 16:37:07.042 objectiveC[3053:403] key:age
2012-07-09 16:37:07.043 objectiveC[3053:403] key:性别
2012-07-09 16:37:07.043 objectiveC[3053:403] key:name
2012-07-09 16:37:07.044 objectiveC[3053:403] key:名次
2012-07-09 16:37:07.044 objectiveC[3053:403] value:25
2012-07-09 16:37:07.045 objectiveC[3053:403] value:男
2012-07-09 16:37:07.045 objectiveC[3053:403] value:张三
2012-07-09 16:37:07.046 objectiveC[3053:403] value:30名
2012-07-09 16:37:07.046 objectiveC[3053:403] key 名次的值是:30名

3、NSArray 不可变的数组   

Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。

[ array count]: 数组的长度

[ array objectAtIndex 0] : 传入数组角标的id 得到数据对象

[ array WithObjects;...] : 向数组对象初始化赋值,这里可以写任意的指针,结尾必须使用nil.

#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc]init];        
        NSArray *array = [NSArray arrayWithObjects:
                                   @"a",
                                    obj,
                                   @"c",nil];
        NSLog(@"array Count:%lu",[array count]);
        //遍历数组
        for (NSObject *object in array) {
            NSLog(@"数组对象:%@", object);
        }
        [obj release];
    }
    return 0;
}

打印结果

2012-07-09 10:52:17.050 objectiveC[944:403] array Count:3
2012-07-09 10:52:17.052 objectiveC[944:403] 数组对象:a
2012-07-09 10:52:17.052 objectiveC[944:403] 数组对象:<NSObject: 0x7fe479c14110>
2012-07-09 10:52:17.053 objectiveC[944:403] 数组对象:c

查找数组索引对应的对象

NSLog(@"Index 2:%@", [array objectAtIndex:2]);

打印结果:2012-07-09 10:55:16.382 objectiveC[993:403] Index 2:c


4、NSMutableArray 可变数组

[NSMutableArray arrayWithCapacity:6] :初始化可变数组对象的长度,如果后面代码继续添加数组超过长度6以后NSMutableArray的长度会自动扩充,6是自己可以设置的颗粒度。
[array addObject:...] : 向可变数组尾部添加数据对象。
[array addObjectsFromArray:..] :向可变数组尾部添加一个数组对象。

#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc]init];   
        NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
        [muArray addObject:@"对象1"];
        [muArray addObject:@"对象2"];
        [muArray addObject:@"对象3"];
        [muArray addObject:@"对象4"];
        [muArray insertObject:@"搅局的" atIndex:2];
        [muArray addObject:obj];
        for (NSObject * object in muArray) {
            NSLog(@"数组对象:%@", object);
        }    
        [obj release];
    }
    return 0;
}

打印

2012-07-09 14:01:08.994 objectiveC[2090:403] 数组对象:对象1
2012-07-09 14:01:08.996 objectiveC[2090:403] 数组对象:对象2
2012-07-09 14:01:08.997 objectiveC[2090:403] 数组对象:搅局的
2012-07-09 14:01:08.997 objectiveC[2090:403] 数组对象:对象3
2012-07-09 14:01:08.998 objectiveC[2090:403] 数组对象:对象4
2012-07-09 14:01:08.998 objectiveC[2090:403] 数组对象:<NSObject: 0x109714110> 

NSRange range = NSMakeRange(0,3); 设置一个范围为 0 到 3 之间。
[array removeObject:obj inRange:range] : 设置在一个范围内删除数据,如果这个范围内没有删除的这个对象则不会删除任何东西。例子中因为obj对象在 数组 0 到 3的范围内,所以obj就被删除掉了。

4.2、removeObject和removeObjectIdenticalTo

[array removeObject:(id)] :删除数组中指定元素,根据对象isEqual消息判断。

[array removeObjectIdenticalTo:(id)] : 删除数组中指定元素,根据对象的地址判断

[array removeObjectIdenticalTo:(id) inRange:(NSRange)] : 在指定范围内删除指定的元素。

[array removeObjectAtIndex:(NSUInteger)]:删除数组中指定脚标索引的数据。

[array removeObjectsInArray:(NSArray *)] :删除一个数组的元素。

下面我们主要验证下removeObject  removeObjectIdenticalTo这两个方法的区别,

先实验removeObject的使用

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSString *str1 = [[NSString alloc] init];
        NSString *str2 = [[NSString alloc] init];
        NSString *str3 = [str1 stringByAppendingFormat:@"字符串"];
        NSString *str4 = [str2 stringByAppendingFormat:@"字符串"];

        NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
        [muArray addObject:@"对象"];
        [muArray addObject:str3];
        [muArray addObject:str4];
        for (NSObject * object in muArray) {
            NSLog(@"数组对象:%@", object);
        }

        if ([str3 isEqual:str4]) {
            NSLog(@"str1 isEqual str2");
        }
        if (str3  == str4) {
            NSLog(@"str1 == str2");
        }
        [muArray removeObject:str3];
        for (NSObject * object in muArray) {
            NSLog(@"数组对象:%@", object);
        }
        [str1 release];
        [str2 release];
    }
    return 0;
}

打印结果

2012-07-09 14:57:52.059 objectiveC[2399:403] 数组对象:对象
2012-07-09 14:57:52.061 objectiveC[2399:403] 数组对象:字符串
2012-07-09 14:57:52.062 objectiveC[2399:403] 数组对象:字符串
2012-07-09 14:57:52.062 objectiveC[2399:403] str1 isEqual str2
2012-07-09 14:57:52.063 objectiveC[2399:403] 数组对象:对象

这时,数组里的两个“字符串”对象都被去除了。

现在试试 removeObjectIdenticalTo

代码改成:  [muArray removeObjectIdenticalTo:str3];

打印结果

2012-07-09 14:59:53.520 objectiveC[2432:403] 数组对象:对象
2012-07-09 14:59:53.521 objectiveC[2432:403] 数组对象:字符串
2012-07-09 14:59:53.522 objectiveC[2432:403] 数组对象:字符串
2012-07-09 14:59:53.523 objectiveC[2432:403] str1 isEqual str2
2012-07-09 14:59:53.523 objectiveC[2432:403] 数组对象:对象
2012-07-09 14:59:53.524 objectiveC[2432:403] 数组对象:字符串

数组中有个还有一个“字符串”留下来了。证明removeObjectIdenticalTo是通过对象的地址做判断的,

我们用对比两个对象isEqual,用==对比对象的地址,打印出来了str1 isEqual str2

inRange的使用

NSRange rang = NSMakeRange(0, 3);
        [muArray removeObject:obj inRange:rang];

指定范围删除对象,其他方法也可以指定范围删除,如果对象不在这个范围内,则不会被删除。

4.3、替换某索引值对应的对象

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc]init]; 

        NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
        [muArray addObject:@"对象1"];
        [muArray addObject:@"对象2"];
        [muArray addObject:@"对象3"];
        [muArray addObject:@"对象4"];
        [muArray addObject:obj];

        for (NSObject * object in muArray) {
            NSLog(@"数组对象:%@", object);
        }
        [muArray replaceObjectAtIndex:4 withObject:@"字符串替换回来"];
        for (NSObject * object in muArray) {
            NSLog(@"数组对象:%@", object);
        }
        [obj release];
    }
    return 0;
}

替换后打印结果

2012-07-09 15:06:01.919 objectiveC[2497:403] 数组对象:对象1
2012-07-09 15:06:01.920 objectiveC[2497:403] 数组对象:对象2
2012-07-09 15:06:01.920 objectiveC[2497:403] 数组对象:对象3
2012-07-09 15:06:01.921 objectiveC[2497:403] 数组对象:对象4
2012-07-09 15:06:01.921 objectiveC[2497:403] 数组对象:字符串替换回来

4.4、数组迭代的遍历方法

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc]init]; 

        NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
        [muArray addObject:@"对象1"];
        [muArray addObject:@"对象2"];
        [muArray addObject:@"对象3"];
        [muArray addObject:@"对象4"];
        [muArray addObject:obj];

        NSEnumerator *enmuerator = [muArray objectEnumerator];
        id object;
        while (object = [enmuerator nextObject]) {
            NSLog(@"数组中的对象:%@", object);
        }
        
        [obj release];
    }
    return 0;
}

打印结果

2012-07-09 16:00:26.153 objectiveC[2691:403] 数组中的对象:对象1
2012-07-09 16:00:26.154 objectiveC[2691:403] 数组中的对象:对象2
2012-07-09 16:00:26.155 objectiveC[2691:403] 数组中的对象:对象3
2012-07-09 16:00:26.155 objectiveC[2691:403] 数组中的对象:对象4
2012-07-09 16:00:26.156 objectiveC[2691:403] 数组中的对象:<NSObject: 0x7f91f8414110>




4.5、NSSet和NSMutableSet是无序的, 但是它保证数据的唯一性。当插入相同的数据时,不会有任何效果。从内部实现来说是hash表,所以可以常数时间内查找一个数据。

1、NSSet的使用

[NSSet setWithSet:(NSSet *)set]; 用另外一个set对象构造
[NSSet setWithArray:(NSArray *)array];用数组构造
[NSSet setWithObjects:...]:创建集合对象,并且初始化集合中的数值,结尾必需使用nil标志。
[set count] ; 得到这个结合对象的长度。
[set containsObject:...]: 判断这个集合中是否存在传入的对象,返回Bool值。
[set objectEnumerator]: 将集合放入迭代器。
[enumerator nextObject]:得到迭代器中的下一个节点数据,使用while遍历这个迭代器,方可遍历集合对象中的对象。
[set isEqualToSet:objset]:判断两个集合是否完全相等,返回Bool值。
[set isSubsetOfSet:objset]:判断集合中的所有数据是否都相等与objeset集合中,返回Bool值。
[set allObjects];

2 以NSArray构造set

 NSArray *array = [[NSArray alloc] initWithObjects:@"对象abc",@"rongfzh", @"totogo2010",nil];
        NSSet *set3 = [NSSet setWithArray:array];
        NSLog(@"%@", set3);

打印

2012-07-10 09:39:02.015 objectiveC[720:403] {(
    rongfzh,
    "\U5bf9\U8c61abc",
    totogo2010
)}

3 set的一些比较方法的使用

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSSet *set = [NSSet setWithObjects:@"25",@"age",@"张三",@"name",@"男",nil];
        NSSet *set1 = [NSSet setWithObjects:@"25",@"age",@"张三",@"name",@"男",@"性别",nil];
        
        NSLog(@"set count:%lu", [set count]);
        //判断是否含有age字符串
        if([set containsObject:@"age"]) {
            NSLog(@"set包含age");
        }
        //判断set 是否等于set1
        if ([set isEqualToSet:set1]) {
            NSLog(@"set 等于 set1");
        }
        //判断set是否是否是set1的子集合
        if ([set isSubsetOfSet:set1]) {
            NSLog(@"set isSubsetOfSet set1");
        }
        //获取所有set对象
        NSArray *array = [set allObjects];
        NSLog(@"array:%@", array);
        
        //迭代遍历
        NSEnumerator *enumerator = [set objectEnumerator];
        for (NSObject *object in enumerator) {
            NSLog(@"set1里的对象:%@", object);
        }
    }
    return 0;
}

打印结果

2012-07-10 09:50:32.018 objectiveC[939:403] set count:5
2012-07-10 09:50:32.020 objectiveC[939:403] set包含age
2012-07-10 09:50:32.021 objectiveC[939:403] set isSubsetOfSet set1
2012-07-10 09:50:32.023 objectiveC[939:403] array:(
    age,
    25,
    "\U7537",
    "\U5f20\U4e09",
    name
)
2012-07-10 09:50:32.027 objectiveC[939:403] set1里的对象:age
2012-07-10 09:50:32.028 objectiveC[939:403] set1里的对象:25
2012-07-10 09:50:32.028 objectiveC[939:403] set1里的对象:男
2012-07-10 09:50:32.029 objectiveC[939:403] set1里的对象:张三
2012-07-10 09:50:32.029 objectiveC[939:403] set1里的对象:name

4.6、NSMutableSet的使用

NSMutableSet继承NSSet,它可以使用NSSet的方法。

[NSMutableSet setWithCapacity:6]:创建可变集合对象,并且初始化长度为6。
[set addObject: obj] : 向集合中动态的添加对象。
[set removeObject:obj]:删除集合中的一个对象。
[set removeAllObjects]:删除集合中的所有对象。
[set unionSet:obj]:向集合中添加一个obj集合的所有数据。
[set minusSet:obj]:向集合中删除一个obj集合的所有数据。
[set intersectSet]:向集合中删除一个不包含obj集合的所有数据。


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSMutableSet *muSet = [NSMutableSet setWithCapacity:6];
        [muSet addObject:@"对象1"];
        NSSet *set = [NSSet setWithObjects:@"对象2",@"对象3", @"被企鹅咬了一口", nil];
        //添加set数据
        [muSet unionSet:set];
        for (NSObject *object in muSet) {
            NSLog(@"all nuSet:%@",object);
        }
        NSSet *set1 = [NSSet setWithObjects:@"对象2",@"对象3", nil];
        
        //在muSet中删除包含set1总数据
        [muSet minusSet:set1];
        for (NSObject *object in muSet) {
            NSLog(@"after minusSet:%@",object);
        }
            
    }
    return 0;
}

打印结果

2012-07-10 10:09:08.194 objectiveC[1156:403] all nuSet:对象1
2012-07-10 10:09:08.196 objectiveC[1156:403] all nuSet:被企鹅咬了一口
2012-07-10 10:09:08.196 objectiveC[1156:403] all nuSet:对象2
2012-07-10 10:09:08.197 objectiveC[1156:403] all nuSet:对象3
2012-07-10 10:09:08.198 objectiveC[1156:403] after minusSet:对象1
2012-07-10 10:09:08.198 objectiveC[1156:403] after minusSet:被企鹅咬了一口




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值