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

来源:互联网 发布:淘宝卖家一直不发货 编辑:程序博客网 时间:2024/04/30 07:29


数组的定义:

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

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

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]) {

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

        }

0 0
原创粉丝点击