OC 集合-学习笔记(数组、字典、Set集合、数值数据)

数组的定义:

数组:数组是有序对象的集合,用来储存对象的有序列表(需注意,不能储存基本数据类型,只能储存对象)。对象:类的具体实现

和字符串一样,数组也有可变数组和不可变数组之分,可变数组是不可变数组的子类,使用数组前得先创建数组对象

NSArray类:(不可变数组)

1.数组的初始化:

  实例方法:NSArray* array=[[NSArray alloc]initWithObject:@"one",@"tow",nil];

  类方法:NSArray * array=[NSArray arrayWithObject:@"one",@"tow",nil];

2.获得数组里元素的个数

  -(NSUInteger)count;

  例如:int count=[array count];

3.获得数组中得元素:

  -(id)objectAtIndex:(NSUInteger)index;

  例如:NSString * srt=[array objectAtIndex:1];//str的值为@"tow"

NSArray类使用注意事项:

1.数组越界,访问NSArray时,最好检查一下索引是否越界

2.数组会对加入其中的对象引用计数加一(内存管理方面)

3.不能再中间加nil,nil是数组结束的标示符

NSMutableArray类:(可变数组)

NSMutableArray是NSArray的子类,所以NSArray的一些方法对MutableArray也适用

1.可变数组的初始化:

  实例方法:-(id)initWithCapacity:(NSUInteger)numItems;

  例如:NSMutableArray* array=[[NSMutableArray alloc]initWithCapacity:12];

  类方法:+(id)initWithCapacity:(NSUInteger)numItems;

2.增加对象:

  -(void)addObject:(id)anObject;//在最后面添加

  例如:[array addObject:@"three"];

  指定位置添加

  -(void)insetObject:(id)anObject atIndex:(NSUInteger)index;//在index处插入一个anObject对象,在index后的对象后移一位

3.删除对象:

  -(void)removeAllObject;//删除数组内的全部对象

  -(void)removeLastObject;//删除数组的最后一个对象

  -(void)removeObjectIndex:(NSUInteger)index;//删除指定对象

4.替换:

  -(void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;//在index位置替换成anObject对象

数组的遍历:

  for(int i=0;i>[array count];i++) { NSL(@"%@",[array objectAtIndex:i]); }

字典NSDictionary(不可变):

首先想一下这几个问题,什么是字典?为什么要用字典?字典和数组的区别是什么?

  字典:就是关键字及其定义所构成的集合。使用字典查找信息比数组快的多。字典的储存方式跟数组不一样,它是采用键查询的优化存储方式,它可以通过关键字立刻查询出来要找的数据,而不用去遍历整个集合去查找。字典和字符串、数组一样也有可变和不可变之分

  

1.创建:

  -(id)dictionaryWithObjectAndKeys:(id)obj,..,..;

  例如:Student * stu1=[Student new];

     Student * stu2=[Student new];

     NSDictionary * dict=[NSDictionary dictionaryWithObjectAndKeys:stu1,@"peter",stu2,@"andy",nil];

     //说明,参数和键都是成对出现,最后以nil为结束标志

2.查找:

  -(id)objectForKey:(id)aKey;//使用键来寻找索要查找的对象

  例如:id student=[dict objectForKey:@"peter"];//得到“peter”键的对象

3.注意事项:

  创建字典时,字典的键和数值都要是id(即对象)类型的;

  创建字典时,传进的参数是键值对,即键和对象要成对出现,最后不要忘记加nil;

  字典的关键字(键)不要重复,如果重复了,后面的值就会覆盖前面的。

NSMutableDictionary类(可变):

  可变字典类是不可变字典的子类,所以上面所用的方法对NSMutableDictionary也适用

1.创建:

  +(id)dictionaryWithCapacity:(NSUInteger)num;

  例如:NSMutableDictionary* dict=[NSMutableDictionary dictionaryWithCapacity:5]

  //说明:创建了初始化大小为5个键值对的可变字典,5只是初始大小,用以提高效率,超过5也会继续往后添加

2.添加:

  -(void)setObject:(id)obj forKey(id)aKey;//关键字和对象成对出现

  例如:Student *stu1=[Student new];

     Student *stu2=[Student new];

     NSMutableDictuinary* dict2=[NSMutableDictionary dictionaryWithCapacity:2];

     [dict2 setObject:stu1 forKey:@"y"]; 

     [dict2 setObject:stu2 forKey:@"k"];

     //注意:如果你添加的关键字在原来字典已经有了,那么你添加的会覆盖原来的关键字的值

3.删除:

  -(void)removeObjectForKey:(id)aKey;//根据关键字删除对应的数据

  例如:对上面新建的字典操作:[dict2 removeObjectForKey:@"y"];结果stu1对象从字典中移除

  -(void)removeAllObject;//删除所有数据

  

4.字典的遍历:

  由于字典是以键值对的形式储存数据,所以无法直接适用索引来遍历字典中得元素,但字典中有一个方法allKeys:

  -(NSArry*)allKeys;//得到字典的所有key值,返回一个数组中,通过返回的数组得到相应的对象,不可变和可变字典遍历方法一样

  适用for循环遍历存放所有的keys的每一个Key,然后再根据key得到相对于的对象

  Student* stu1=[Student new];

Student* stu2=[Student new];

NSDictionary* dict=[NSDictionary dictionaryWithObjectsAndKeys:stu1,@"m",stu2,@"k", nil];

NSArray* keys=[dict allKeys];

id key,value;

for (int i=0; i<[keys count]; i++) {

key=[keys objectAtIndex:i];

value=[dict objectForKey:key];

NSLog(@"key:%@,value:%@",key,value);

}

Set集合(NSSet,不可变):

  NSSet集合跟数组差不多,但Set集合不能存放相同的对象,它是一组单值对象的集合,被存放对进集合中得数据的无序的。

1.NSSet的初始化:

  -(id)initWithObjects:(id)firstObject,...,nil;

  +(id)setWithObjects:(id)firstObject,...,nil;

  例如:NSSet* set=[[NSSet alloc]initWithObjects:@"one",@"two",nill;

2.NSSet的个数:

  -(NSUInteger)count;

3.NSSet中得元素:

  -(NSArray*)allObject;//得到集合中所有元素,以数组的形式返回

  -(id)anyObject;//随机获得集合中某个元素

4.NSSet的一些判断方法:

  -(BOOL)isEqualToSet:(NSSet*)otherSet;//判断和另一集合otherSet是否相等

  -(BOOL)member:(id)obj;//判断本集合是否包含对象obj

5.需要注意的:

  Set集合不能存放相同对象,元素都是无序存放的

  它和数组不同的是:

  NSArray:有序几集合,储存元素在一个整块的内存中并按序排列

  NSSet:无序集合,散列存储。

  在搜索一个对象时,NSSet比NSArray效率高,主要是因为NSSet用到一个算法hash(散列,直译为哈希),NSSet直接通过hash找到想要找的元素,而数组则要遍历整个数组,显然效率要低。

NSMutableSet(可变):

1.NSMutableSet的创建:

  -(id)initWithCapacity:(NSUInteger)numItems;//实例方法

  +(id)setWithCapacity:(NSUInteger)numtems;//类方法

  同样numtems是初始大小,并不限制集合大小

2.增加集合的元素:

  -(void)addObject:(id)object;

  //[set addObject:student];

3.删除集合中得元素

  -(void)removeAllObject;//删除集合中所有元素

  -(void)removeObject:(id)object;//删除集合中object对象

  例如:[set removeObject:student];

数组数据:

 上面所说得集合不能存放基本数据类型,那么如何把基本数据类型封装成对象呢?NSNumber类型就是解决这一问题

NSNumber类:

1.创建封装方法

  +(NSNumber)numberWithChar:(char)value;//封装一个char数据类型

  +(NSNumber)numberWithInt:(int)value;//封装一个int数据类型

  +(NSNumber)numberWithFloat:(float)value;//封装一个单精度数据类型

  +(NSNumber)numberWithBOOL:(BOOL)value;//封装一个双精度数据类型

  以上是所列举的类方法

  -(id)initWithChar:(char)value;

  -(id)initWithInt:(int)value;

  -(id)initWithFloat:(float)value;

  -(id)initWithBOOL:(BOOL)value;

  比如:NSNumber *number=[NSNumber numberWith:3];//把int类型的3封装成一个NSNumber;

  上面是封装基本类型的,那结构体该这么封装呢?用NSValue

NSValue的创建及使用: 

  +(NSValue*)valueWithBytes:(const void*)value objCType:(const char*)type;

  第一个参数是机构体地址,第二个参数是用来描述这个数据类型的字符串,用来说明结构体中得实体的类型和大小,用@encode编译器指令可以接受数据类型的名字并为你生成适合的字符串。

  NSRect rect=NSMakeRect(4,4,100,100);

  NSValue* value=[NSValue valueWithBytes:&rect objCType:@encode(NSRect)];

  [array addObject:value];

  这样我们就把一个结构体封装成一个NSValue类型的对象

从NSValue中获取值

  -(void)getValue:(void *)value;

  调用getValue时,要传递的是要存储这个数值的变量地址,类似scanf()函数

  比如:NSValue *value=[array objectAtIndex:0];

     NSRect rect1;

     [value getValue:&rect1];

     这样就把NSValue转换成结构体的结果通过rect1的地址赋值给rect1.

NSNull

  nil放进集合里面代表着结束,那如何要把空值存放到集合里面?

  cocoa提供了一个NSNull类,用这个类来封装nil空值。

  +(NSNull*)null;

  比如:[array addObject:[NSNull null] ];

id nullValue=[array objectAtIndex:0];

if (nullValue==[NSNull null]) {

//如果空值的花,做一些操作

}

时间: 2024-11-05 05:21:40

OC 集合-学习笔记(数组、字典、Set集合、数值数据)的相关文章

Objective-C学习笔记_字典、集合、数组排序

一字典类 二集合类 三数组字典集合的快速遍历 四数组排序 五数组元素按照数值大小排序 一.字典类 字典?于保存具有映射关系(key-value对)数据的集合.对于"姓名:张三"来讲,key就是"姓名",key对应的value是"张三".一个key-value对认为是?个条目,字典是存储key-value对的容器.与数组不同,字典靠key存取元素.key不能重复,value必须是对象.键值对在字典中是无序存储的.字典也分为,不可变字典(NSDict

python 学习笔记day05-python字典和集合、条件和循环、文件和输入输出

字典和集合 字典基础操作 创建字典 通过{}操作符创建字典 通过dict()工厂函数创建字典 通过fromkeys()创建具有相同值的默认字典 >>> aDict = {'Name':'Bob','age':23}                >>> import tab                >>> bDict = dict((['name','bob'],['age',23]))                >>> p

Python学习笔记四--字典与集合

字典是Python中唯一的映射类型.所谓映射即指该数据类型包含哈希值(key)和与之对应的值(value)的序列.字典是可变类型.字典中的数据是无序排列的. 4.1.1字典的创建及赋值 dict1={} dict2={'name':John,'age':24} 使用dict()函数创建字典. dict()函数接受序列,或关键字参数作为参数创建字典.若不提供参数则创建空字典. dict1=dict([['x',1],['y',2]])#接受list作为参数创建字典 dict2=dict(x=1.y

[Guava学习笔记]Collections: 不可变集合, 新集合类型

不可变集合 不接受null值. 创建:ImmutableSet.copyOf(set); ImmutableMap.of(“a”, 1, “b”, 2); public static final ImmutableSet<Color> GOOGLE_COLORS = ImmutableSet.<Color>builder() .addAll(WEBSAFE_COLORS) .add(new Color(0, 191, 255)) .build(); 可以有序(如ImmutableS

Go语言学习笔记十三: Map集合

Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. Go语言中Map的写法比Java简单些,比Python繁琐. 定义Map var x map[string]string x : = make(map[string]string) 写法上有些奇怪,map为关键字,右侧中括号内部为key的类型,中括号外部为value的类型.一般情况下使用逗号或者冒号

Swift学习笔记(5)--字典

1.定义 //1.基本定义 [key 1: value 1, key 2: value 2, key 3: value 3] var dict = ["name":"Xiaoqin","sex":"female","age":"20"] for (key,value) in dict { println(key,value) } //2.类型强制定义 Dictionary<keyT

PHP学习笔记-数组(1)

1-1 数组定义 1.什么是数组? 所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量. 语法如下: <?php //设置某个变量为一个空数组 $arr=array(); ?> 1-2 索引数组初始化 PHP有两种数组:索引数组.关联数组. 索引和关联两个词都是针对数组的键而言的. 索引数组是指数组的键是整数的数组

python 学习笔记 三 字典

字典 Python的高效的key/value哈希表结构叫做"dict", dict的内容可以写成一系列的key:value对并放入{ }中, 相当于: dict = {key1:value1, key2:value2, ...}, 一个空的字典就是俩个大括号{ }. 下面是从一个空字典创建字典以及一些关键点: 数字, 字符串和元组可以作为字典的key, value可以是任何类型(包括字典). ## Can build up a dict by starting with the the

JS学习笔记-数组

ECMAScript中没有提供类和接口等的定义,但它却是一门面向对象的语言,由于它能够通过其它 方式实现类似高级语言的面向对象功能,这些内容将在后面的文章中进行一步步的总结.此篇仅对JS中对象作简要说明,重点汇总一些类似于对象的数组的经常用法. 对象 创建 上篇提到创建对象的两种方式: 使用new运算符创建Object var obj = new Object(); 使用字面量方式创建 var   obj = {}; 这里值得注意的是在使用字面量(常量)创建Object时不会调用构造函数. 属性

js学习笔记——数组方法

join() 把数组中所有元素转化为字符串并连接起来,并返回该字符串, var arr=[1,2,3]; var str=arr.join("#"); //str="1#2#3"; 如果没有指定分隔符,则默认为逗号 var str2=arr.join(); //str2="1,2,3"; reverse() 在原数组上把元素的顺序颠倒过来,并返回该数组 var arr=[1,2,3]; arr.reverse(); //arr=[3,2,1];