Day5 oc 数据结构之Foundation字符串,数组,字典
oc数据结构
(摘自千峰学院课程及http://www.jianshu.com/p/34bba09c95d4,以后我的原创产品也搬到简书喽)
- oc兼容c语言,自然兼容c的所有数据结构
- oc特有数据结构
NSString:不可变字符串
//字符串的创建,创建以后内容将不可改变 #import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ char* p = "hello world";//首先,oc完全兼容c语言的字符串语法 //strlen(p);计算/0前字符长度,中文占3个字符 NSLog(@"%s",p); //4种创建字符串的方法 NSString* str1 = @"hello world";//字符串对象 //[str1 length]算的是字数,中文算一个字数 NSString* str2 = [[NSString alloc]initWithString:str];//用一个字符串创建另一个字符串 NSString* str3 = [[NSString alloc]initWithUTF8String:"hello world"];//用c的字符串来创建一个oc的字符串对象,c字符串转为oc字符串 //const char *c = [str3 UTF8String];oc字符串转c NSString *s = [[NSString alloc] initWithContentsOfFile:@"/Users/test.txt" encoding:NSUTF8StringEncoding error:nil];//文件,也可写为 NSURL *url = [[NSURL alloc] init] initWithString:@"file:///Users/test.txt"; NSString *s1 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSString* str4 = [[NSString alloc]initWithFormat:@"hello %d %c",5,'C'];//使用格式符拼接成一个字符串对象 NSLog(@"%@",str1); NSLog(@"%@",str2); NSLog(@"%@",str3); NSLog(@"%@",str4); //直接调用类方法,NSString类方法以string开头 NSString* str5 = [NSString stringWithString:str]; NSString* str6 = [NSString stringWithUTF8String:"hello world"]; NSString* str7 = [NSString stringWithFormat:@"%d %@ %c",1,@"hello",'C']; NSLog(@"%@",str5); NSLog(@"%@",str6); NSLog(@"%@",str7); [str3 release];//alloc创建需释放内存,由于ARC,所以可不写 [str2 release]; [str1 release]; } return 0; }
//字符串的比较 #import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSString str1 = @"123"; NSString str2 = @"456"; BOOL res = [str1 isEqualToString:str2];//比较两个字符串内容是否相同 NSLog(@"%d",ret); NSComparisonResult ret = [str1 compare:str2];//按字母表顺序比较 //NSComparisonResult返回值是一个枚举类型,NSOrderedAscending=-1,NSOrderedSame=0,NSOrdereDescending=1 if(ret==NSOrderedAscending){ NSLog(@"str1<str2");//结果 }else if (ret==NSOrderedSame){ NSLog(@"str1==str2");//123 和123 相等 }else if (ret==NSOrdereDescending){ NSLog(@"str1>str2"); } return 0; }
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ //一个字符串中查找子串 NSString* str = @"I am a so bad man"; NSString* subStr=@"so"; NSRange range = [str rangeOfString:subStr];//NSRange是一个结构体,一个属性是location,一个是length. NSLog(@"location:%lu,length:%lu",range.location,range.length);//结果为7 //从一个字符串生成一个子串 NSString str1 = @"0123456789"; NSString str2 = [str1 substringToIndex:6];//从str中提取6(0-5从0开始数)个字符,生成新字符串,返回字符串地址 NSString str3 = [str2 substringFromIndex:6];//从第7(6从0开始数)个字符提取到最后 NSLog(@"str1"); NSLog(@"str2");//012345 NSLog(@"str3");//6789 //NSRange range2 = {3,4};//location,length //NSString str4 = [str1 substringWithRange:range2]; NSString str4 = [str1 substringWithRange:NSMakeRange(3,4)]; NSLog(@"str4");//3456 } return 0; }
NSMutableString:可变字符串
继承自NSString,所以可以使用普通字符串的方法,并在NSString的基础上扩展了新的方法,4大类,增、删、改、查。
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ //NSMutableString* str1 = @"hello world";//不可以这样使用 //实际上可变字符串可以这样使用 NSMutableString* str1 = [NSMutableString alloc]init]; [str1 setString:@"Hello"];//设置可变字符串的内容 [str1 setString:@"World"];//再次设置会覆盖掉原有的字符串,str1=@"world" //增 [str1 appendString:@"123"];//追加字符串 [str1 appendFormat:@"%c",'d']; [str1 insertString:@"XXXX" atIndex:4];//插入字符串 //没有插入Format,但可以这样处理 [str1 insertString:[NSString stringWithFormat:@"%d",-54]atIndex:7]; //删 NSLog(@"%@",str1);//用法见ps [str1 deleteCharactersInRange:NSMakeRange(3,5)];//删除一定范围内的字符,从第3个开始删除5个字符 //改 [str1 replaceCharactersInRange:NSMakeRange(3,2) withString:@"XXXXX"];//替换一个范围内的字符,替换的字符长度不受原范围长度的限制,从第3个替换2个字符 } return 0; }ps:NSLog格式
NSArray不可变数组(有序)(NSArray,NSSet,NSDictionary是集合类)
NSArray (java中为ArrayList)
有序
快速创建(不可变):@[]
快速访问元素:数组名[i]
NSSet (java中为HashSet)
无序
NSDictionary (java中为HashMap)
无序
快速创建(不可变):@{key1:value1,key2:value2}
快速访问元素:字典名[key]
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSArray *array1 = [NSArray array];//创建个空数组 NSArray *array = [NSArray alloc]initWithObjects:@"one",@"two",@"three",nil];//数组中装着元素的地址,数组的元素可以是任意对象 NSArray *array = [NSArray arrayWithObjects:@"one",@"two",nil];//最后一个nil结尾不能省,oc数组只能存放oc对象,不能存放非oc对象,也不能存放nil //或者NSArray *array = @["@one","@two"]; //打印数组 NSLog(@"%@",array);//打印调用重写的description方法 //数组遍历,4种方法 //枚举器法 NSEnumerator* emumerator = [array objectEnumerator];//创建枚举器 id obj; while(obj=[enumerator nextObject]){ NSLog(@"%@",obj); } //快速枚举法 for(id obj in array){ NSLog(@"%@",obj); } //使用i值遍历 NSInteger length = [array count]; NSInteger i; for(i=0;i<length;i++){ NSLog(@"%@",[array objectAtIndex:i]); //或者NSLog(@"%@",array[i]);(编译器特性) } } //block遍历数组,每遍历一个元素,就会调用一次block,会把当前元素和索引位置参数传给block [array enumerateObjectsUsingBlock: ^(id obj,NSUInteger idx,BOOL *stop){ NSLog(@"%ld-%@",idx,obj); if(idx == 0){ *stop = YES;//遍历一次即停止 } } ]; return 0;
NSMutableArray:可变数组
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ //是Array的子类,因此父类的方法也可以调用 NSMutableArray* array = [NSMutableArray alloc]init]; [array addObject:@"one"];//增加元素 [array addObject:@"two"]; [array addObject:@"three"]; [array addObject:@"four"]; [array addObject:@"five"]; [array removeObject:@"one"];//删除元素 [array removeObjectAtIndex:1]; [array exchangeObjectAtIndex:3 withObjectAtIndex:4];//交换元素的位置 //同样进行遍历 //使用枚举器正序遍历时修改数组内容会导致程序崩溃 NSEnumerator* enumeratoe = [array objectEnumerator]; id obj; while(obj=[enumerator nextObject]){ [array removeLastObject]; NSLog(@"%@",obj); } //使用枚举器逆序遍历的时候修改数组内容,不会导致程序崩溃 NSEnumerator* enumeratoe = [array reverseObjectEnumerator]; id obj; while(obj=[enumerator nextObject]){ [array removeLastObject]; NSLog(@"%@",obj); } //使用快速枚举法时仍然不能对数组个数和内容进行修改,即使是可变数组 //使用i进行遍历时可以对可变数组进行修改 } return 0; }
NSMutableArray内存管理中的用法
NSMutableArray *array =[[NSMutableArray alloc] init]; for(int i=0;i<10;i++){ Dog *dog = [[Dog alloc] init]; [dog setId:i]; [array addObject:dog];//array会对dog对象计数器加1 [dog release]; } for(Dog *d in array){ NSLog(@"dog is %d",[d ID]); } [array release];
数组和字符串的综合使用
//将一个字符串中的单词逆序,如何实现 #import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSString* str = @"I am a so bad man"; NSArray* array = [str componentsSeparatedByString:@" "];//将字符串以空格进行分割后存到数组中 NSMutableArray* mutableArray = [[NSMutableArray alloc]init]; NSEnumerator* enumerator = [array reverseObjectEnumerator];//逆序遍历 NSString* obj; while(obj = [enumerator nextObject]){ [mutableArray addObject:obj];//mutableArray中就是逆序的 } NSString* newStr = [mutableArray componentsJoinedByString:@" "];//将数组中的元素插入空格拼成新的字符串 } NSLog(@"%@",mutableArray); } return 0; }
NSDictionary:字典(无序)
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSDictionary *dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3",nil]; NSDictionary *dict = @{@"name":@"aaa",@"age":@"3"};//编译器新特性 //字典中的元素都是以键值对的形式存储的 //@"one"和@"1"组成了一个键值对 //@"one"称为值(Value),@"1"称为键(Key) //键值对的值和键,都是任意的对象,但是键往往使用字符串 //字典中存储对象的地址没有顺序,这是与数组的不同 NSLog(@"%@",dict);//字典同样重写了description NSArray *keys = @[@"name",@"age"]; NSArray *objects = @[@"aaa",@"3"]; NSDictionary *dict = [NSDictionary dictionaryWithObjects forKeys:keys]; //字典中也可以进行遍历,而且分为键的遍历和值的遍历 NSEnumerator* enumerator = [dict keyEnumerator];//键遍历 id obj; while(obj = [enumerator nextObject]){ NSLog(@"%@",obj); } NSEnumerator* enumerator = [dict objectEnumerator];//值遍历 id obj;//因为没有顺序,也就没有顺序遍历和逆序遍历 while(obj = [enumerator nextObject]){ NSLog(@"%@",obj); } NSString * str = [dict objectForKey:@"1"];//通过键找到值 //快速遍历 for(id obj in dict){ NSLog(@"%@",obj);//遍历得到的是键,字典重要的左右就是迅速根据键找到值 NSLog(@"%@",[dict objectForKey:obj]); //NSLog(@"%@",dict[obj]);简化方式 } } return 0; }
NSMutableDictionary:可变字典,可以更改键值对
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSMutableDictionary *dict = [[NSMutableDictionary alloc]init]; [dict setObject:@"one" forKey:@"1"];//添加 [dict setObject:@"two" forKey:@"2"]; [dict setObject:@"three" forKey:@"1"];//多次给一个key赋值,会覆盖之前的值,因此这里有两个键值对 NSLog(@"%@",dict); [dict removeObjectForKey:@"1"];//删除 } //遍历 NSArray *keys = [dict allKeys];//返回的是无序的 for(int i = 0;i < dict.count;i++) { NSString *key = keys[i]; NSString *object = dict[key]; NSLog(@"%@ = %@",key,object); } [dict enumerateKeysAndObjectsUsingBlock:^(id key,id obj,BOOL *stop){ NSLog(@"%@ = %@",key,obj);}]; return 0; }
NSNumber
NSNumber的对象可以是任何的数字类型,整型,浮点型,字符型等基本数据类型,NSNumber是一个类簇(还有UIButton),作用是把基本数据类型变成对象
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSNumber* intNumber = [NSNumber alloc]initWithInt:5]; //NSNumber *intNumber = [NSNumber numberWithInt:5];使用类方法创建 //NSDictionary *dict = @{@"name":@"aaa",@"age": intNumber}; //可简写为NSDictionary *dict = @{@"name":@"aaa",@"age":@5};编译器特性 //将基础数据类型包装成NSNumber,int a=5,包装后为@(a), //NSNumber *num = dict[@"age"]; //int a = [num intValue]; NSNumber* floatNumer = [[NSNumber alloc]initWithFloat:3.14f]; NSNumber* doubleNumber = [[NSNumber alloc]initWithDouble:6.7]; NSNumber* charNumber = [[NSNumber alloc]initWithChar:'A']; NSNumber* intNumber2 = [NSNumber numberWithInt:6]; BOOL res =[intNumber isEqualToNumber:intNumber2];//可以比较两个数值是否相等 //BOOL res =[intNumber isEqualToNumber:floatNumber];//两个NSNumber之间都可以比较 NSLog(@"%d",res); NSLog(@"%d",[intNumber intValue]);//还原对应的数据 NSLog(@"%f",[floatNumber floatValue]); NSLog(@"%f",[doubleNumber doubleValue]); NSLog(@"%c",[charNumber charValue]); //两个数据之间的比较 if([intNumber compare:intNumber2]==NSOrderedAscending){ NSLog(@"<"); }else if([intNumber compare:intNumber2]==NSOrderedSame){ NSLog(@"="); }else if([intNumber compare:intNumber2]==NSOrderedDescending){ NSLog(@">"); } } return 0;
NSSet:集合(无序 哈希表 散列算法 查找元素比数组更快)
和数组NSArray(有序)相似,只是有序和无序的区别,而且集合中的相同元素只能有一个
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSSet* set = [[NSSet alloc]initWithObjects:@"one",@"two",@"three",@"four",@"five",nil];//若加一个@"one",则打印出来仍然只有一个one,相同元素只有一个 NSLog(@"%@",set);//打印出来的无序 //set[0];错误,因为是无序的 NSLog(@"%lu",[set count]); BOOL res = [set containsObject:@"five"];//判断集合中是否含有某个元素 NSSet* set2 = [[NSSet alloc]initWithObjects:@"one",@"two",@"three",@"four",@"five",@"six",nil]; BOOL res = [set isEqualToSet:set2];//判断两个集合是否相同 BOOL res = [set isSubsetOfSet:set2];//判断一个集合是否是另一个集合的子集合 NSEnumberator* enumberator = [set objectEnumerator]; id obj; while(obj = [enumerator nextObject]){ NSLog(@"%@",obj); } //也可以使用数组中的元素创建一个集合 NSArray* array = [[NSArray alloc]initWithObjects:@"one",@"two",@"three",@"four",@"five",nil]; NSSet* set = [NSSet alloc]initWithArray:array]; //也可以使用一个集合生成一个数组 NSArray* array2 = [set allObjects]; } return 0; }
NSMutableSet:可变集合(NSSet子集)
可以动态添加和删除元素,如果添加的元素有重复,实际上只保留一个
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSMutableSet* set = [[NSMutableSet alloc]init]; [set addObject:@"one"]; [set addObject:@"two"]; [set addObject:@"three"]; [set addObject:@"four"]; [set addObject:@"two"];//重复,只保留一个 [set removeObject:@"three"]; NSSet* set2 = [[NSSet alloc]initWithObjects:@"five",@"six",nil]; [set unionSet:set2];//set2中的元素将被添加到set中 [set minusSet:set2];//从set中减去set2 } return 0; }
NSIndexSet:索引集合
是集合的一个变种,但并没有继承关系。可以通过index找到集合中的一个元素,insexSet中装的都是数字
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSIndexSet* indexSet = [[NSIndexSet alloc]initWithIndexesInRange:NSMakeRange(2,3)];//给一个范围,集合中就是范围中的全部数据,现在集合中的数据就是2、3、4. NSArray* array = [[NSArray alloc]initWithObjects:@"one",@"two",@"three",@"four",@"five",@"six",nil]; //通过一个索引的集合,可以取得数组中的部分元素 NSArray* newArray = [array objectsAtIndexes:indexSet];索引为2、3、4时,数组中对应的元素 NSLog(@"%@",newArray);//newArray中的元素为@"three",@"four",@"five". } return 0; }
NSValue
NSValue是NSNumber的父类,用于将结构体,指针等复杂数据类型,存储为对象。
NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue,NSValue可以包装所有数据类型为对象
CGPoint p = CGPointMake(1,1); //将结构体转换为Value对象 NSValue *value = [NSValue valueWithPoint:p]; //将value转换为对应结构体 [value pointValue];
#import <Foundation/Foundation.h> //声明一个结构体类型 struct sct{ int a; int b; }sctt={4,5}; int main (int argc,const char* argv[]) { @autoreleasepool{ NSValue* value = [[NSValue alloc]initWithBytes:&sctt objCType:@encode(struct sct)];//@encode将类型转换为一个字符串,用于区分不同的类型,每个类型生成的字符串是唯一的 NSLog(@"%s",@encode(int)); if(strcmp(value.objCType,@encode(struct sct))==0){ NSLog(@"This is struct sct."); } struct sct newSctt; [value getValue:&newSctt];//将结构体的数据存到对象中 NSLog(@"%d %d",newSctt.a,newSctt.b); char* p = (char*)0x1F;//有一个指针p,初始化为0X1F NSValue* value = [[NSValue alloc]initWithBytes:&p objCType:@encode(char*)]; char* q; [value getValue:&q]; NSLog(@"%p",q);//打印结果为0X1F. CGPoint point; CGSize size; CGRect rect; NSRange range; NSValue* pointValue = [NSValue valueWith:point]; NSValue* sizeValue = [NSValue valueWith:size]; NSValue* rectValue = [NSValue valueWith:rect]; NSValue* rangeValue = [NSValue valueWithRange:NSMakeRange{3,4}]; } return 0; }
NSData
NSData:用于将信息写入文件时转化为0、1字节流,NSData就用于存储字节流,类似于C语言中的buffer.
char buf[10];
#import <Foundation/Foundation.h> int main (int argc,const char* argv[]) { @autoreleasepool{ NSString* string = @"hello world"; NSData* data = [string dataUsingEncoding:NSUTF8StringEncoding];//字符串存储为NSData对象中 NSLog(@"%s",data.bytes);//可以打印出字符串 NSString* newString = [NSString stringWithData:data encoding:NSUTF8StringEncoding];//NSData对象转化为字符串. NSLog(@"%@",newString); } NSDate *date1 = [NSDate date];//创建一个时间对象,0时区的时间 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormatter = @"yyyy-MM-dd HH:mm:ss";//H:24小时制,h:12小时制 NSString *str = [formatter stringFromDate:date]; NSDate *date3 = [NSDate dateWithTimeInterval:5 sinDate:date1];timeInterval是秒 return 0; }
相关推荐
WorldofiOs 2016-01-15
Swen 2011-08-01
bxqybxqy 2012-11-26
shipinsky 2019-07-01
唯美st丶 2016-05-05
JINLINHUOFENG 2014-01-04
madaxin 2016-01-15
81751493 2015-11-24
vicunana 2014-07-30
81570790 2012-02-27
88497010 2012-01-17
89283517 2012-01-17
87214552 2012-01-14
81731290 2011-10-24
CaiKanXP 2017-08-12
oraulvo 2019-05-05
hyunbar 2016-07-24
cardinal 2016-07-23
88497010 2014-03-04