字典
字典用于保存具有映射关系(key-value对)数据的集合。
与数组不同,字典靠key存取元素。
key不能重复,value必须是对象。
键值对在字典中是无序存储的。
字典分:不可变字典(NSDictionary)和可变字典(NSMutableDictionary)
NSDictionary:
字典一旦创建,键值对就不可更改,不可添加,不可删除。
仅能读取key或者value。
创建字典对象。
获取所有key值,获取所有value值。通过key值查询value。
//不可变字典 ObjectsAndKeys先存对象,在存对应的key
NSDictionary *dic = [[NSDictionaryalloc]initWithObjectsAndKeys:@"king",@"name",@"23", @"age",nil];
// NSLog(@"%@", dic);
NSDictionary *dic1 = [NSDictionarydictionaryWithObjectsAndKeys:@"queen",@"name",@"22", @"age",nil];
// NSLog(@"%@", dic1);
//通过key找到对应的value
NSLog(@"%@", [dic1objectForKey:@"name"]);
//找到所有的key
NSLog(@"%@",dic.allKeys);
//找到所有value
NSLog(@"%@",dic.allValues);
//key-value对数
NSLog(@"%ld", dic.allKeys.count);
无序的
字典中存放的时成对出现
字典里的key不能重复
NSMutableDictionary
可变字典
NSDictionary的子类。可以对管理的键值对进行增、删、改。
//可变字典
//创建空字典
NSMutableDictionary *dic = [NSMutableDictionarydictionary];
NSMutableDictionary *dic1 = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"king",@"name",@"23", @"age",nil];
NSMutableDictionary *dic2 = [[NSMutableDictionaryalloc]initWithObjectsAndKeys:@"queen",@"name",@"22", @"age",nil];
//增加键值对
[dic1 setObject:@"shopping" forKey:@"stuHobby"];
NSLog(@"%@", dic);
//如果key已经存在,相当于对这个key所对应的value进行重新赋值
[dic1 setObject:@"24" forKey:@"age"];
NSLog(@"%@", dic1);
[dic setValue:@"LOL" forKey:@"stuHobby"];
NSLog(@"%@", dic);
//以上两个方法都可以实现对字典的value重新赋值的功能,但是setObject是字典的方法,setValue是KVC的方法,不要弄混,我们应该使用字典自己的方法
//删除键值对
[dic1 removeObjectForKey:@"age"];
NSLog(@"%@", dic1);
// 用快速枚举的方式遍历字典 in后面放容器
for(NSString*strin dic1) {
NSLog(@"%@", [dic1objectForKey:str]);
}
//对字典使用快速枚举的方式进行遍历,in前面对应的是key的类型,然后再根据对应的key找到对应的value
//字面量创建一个不可变字典
NSLog(@"%@", dic1[@"name"]);
//字面量创建一个字典前面是key,后面是value 数组输出的时候是(),字典是{}
NSDictionary *d = @{@"stuName" :@"joker",@"age" :@"60" };
NSLog(@"%@", d);
// 字典套数组
NSMutableArray *arr1 = [NSMutableArrayarrayWithObjects:@"1",@"2",@"3", @"4",@"5",nil];
NSMutableArray *arr2 = [NSMutableArrayarrayWithObjects:@"6",@"7",@"8", @"9",@"10",nil];
NSMutableDictionary *dic = [NSMutableDictionarydictionaryWithObjectsAndKeys:arr1,@"arr1", arr2,@"arr2", nil];
for(NSString*strindic) {
NSMutableArray*tempArr= [dic objectForKey:str]; //str是key,我们要的value
for(NSString *tempStrintempArr) {
NSLog(@"%@", tempStr);
}
}
//数组套字典
//知道每一层的结构,然后使用forin
NSMutableDictionary *dic1 = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"1",@"2", @"3", @"4",@"5", @"6", nil];
NSMutableDictionary *dic2 = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"7",@"8", @"9", @"10",nil];
NSArray *arr = @[dic1, dic2];
// in 前的是结构里边的类型
for (NSMutableDictionary *dicin arr) {
for (NSString *strin dic) {
NSLog(@"%@", [dicobjectForKey:str]);
}
}
for (NSDictionary *dicin arr) {
for (NSString *strin dic) {
NSLog(@"%@", [dicobjectForKey:str]);
}
}
数组字典相互嵌套
// *****
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"2", @"3", @"4", @"5", @"6", nil];
NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"7", @"8", @"9", @"10", nil];
NSArray *arr1 = @[dic1];
NSArray *arr2 = @[dic2];
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:arr1, @"arr1", arr2, @"arr2", nil];
for (NSString *dicStr in dic) {
NSArray *dicArr = [dic objectForKey:dicStr];
for (NSMutableDictionary *tempDic in dicArr) {
for (NSString *str in tempDic) {
NSLog(@"%@", [tempDic objectForKey:str]);
}
}
}
//打开第一层,最外层是一个字典
for (NSString *dicStr in dic) {
NSArray *dicArr = [dic objectForKey:dicStr];
//打开第二次,中间是数组
for (NSMutableDictionary *tempDic in dicArr) {
//打开最后一层
for (NSString *str in tempDic) {
NSLog(@"%@", [tempDic objectForKey:str]);
}
}
}
//容器之间互相嵌套,解决方法就是 明确 容器的数据类型,然后一层一层解析里面对应的数据类型
集合(Set)
NSSet *set = [[NSSet alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"5", nil];
// NSLog(@"%@", set);
//集合的创建方法和数组相似, 但是数组是有序的,集合是无序的,而且集合里的对象是唯一的
// 遍历构造器的方式创建一个集合
NSSet *set1 = [NSSet setWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
// 集合中如果有相同的对象,把这个对象当成一个对象来看
NSLog(@"%ld", set.count);
// 对集合使用forin进行遍历
for (NSString *str in set) {
NSLog(@"%@", str);
}
// 集合是否包含某一个对象
NSLog(@"%d", [set containsObject:@"2"]);
// 集合里的某一个对象
NSLog(@"%@", [set anyObject]);
//对数组进行排序
// 对不可变数组进行排序
NSArray *arr = [NSArray arrayWithObjects:@"king", @"queen", @"joker", @"aaa", @"sss", nil];
//方法选择器
//括号里边就是我们要选择使用的方法
SEL method = @selector(compare:);
//用一个新的数组来接受排序之后的结果
NSArray *newArr = [arr sortedArrayUsingSelector:method];
NSLog(@"%@", newArr);
// 对可变数组进行排序
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"king", @"queen", @"joker", @"aaa", @"sss", nil];
[arr sortUsingSelector:@selector(compare:)];
NSLog(@"%@", arr);
集合特点:
与数学中的集合一样,集合中的元素唯一。 存储的元素是无序的 存储元素必须是对象类型
iOS中⽤用Set表⽰示集合,分NSSet和NSMutableSet
NSCountedSet是NSMutableSet的子类能记录元素的重复次数。
在set的基础上添加了计数功能。
- countForObject:
排序:
数组排序取决于判断条件,判断条件决定了排序的方式(升序、
降序)。
iOS为数组类提供了排序方法,同时提供了接口让我们传递判断条件。
[array sortedArrayUsingSelector:<#(SEL)#>]
[mutableArray sortUsingSelector:<#(SEL)#>]
@selector,获取⽅方法名。这个方法名是数组中元素的方法。默认使⽤用升序排列。
总结:
forin
for (<#type *object#> in <#collection#>) {
}
1、object是遍历得到的元素对象。2、collection是集合类型的对象:数组、字典、集合。
数组枚举得到数组中的元素对象。
字典枚举得到字典中的key值。
集合枚举得到集合中的元素对象。
字典是一种存储键值对的容器,靠key来索引数据。集合存储的数据无序、不重。
for(type *obj in collection)是OC中快速遍历数据的方式。数组封装了排序,同时为我们提供了接口,方便我们控制排序。每一种collection都有自己特点,使用符合自己需求的collection。