Objective-c 语法之集合NSDictionary NSSet NSArray

2024-05-28 18:58

本文主要是介绍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 是否等于set1if ([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:被企鹅咬了一口




这篇关于Objective-c 语法之集合NSDictionary NSSet NSArray的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011416

相关文章

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na