zoukankan      html  css  js  c++  java
  • 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]) {

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

            }

  • 相关阅读:
    ubuntu下ftp服务
    git远程提交失败
    ImportError: libQtTest.so.4: cannot open shared
    python-----群发图片
    pytorch------cpu与gpu load时相互转化 torch.load(map_location=)
    python-----用多张图片生成视频
    python-----实现微信撤回消息还原
    not syncing : corrupted stack end detected inside scheduler
    树莓派-----中文输入法设置
    树莓派-----局域网电脑远程桌面连接
  • 原文地址:https://www.cnblogs.com/mojiewei/p/4773593.html
Copyright © 2011-2022 走看看