字典用于保存具 有映射关系(key-value)数据的集合
一个key-value对认为是一个项目(Entry),字典是存储key-value对z的容器
1.字典靠key存取元素
2.key不能重复 value必须是对象(如果不是对象用NSNumber、NSValue)
3.键值对在字典中是无序存储的
4.字典分不可变字典(NSDictionary)和可变字典(NSMUtableDictionary)
5.不可变字典,字典一旦创建,键值不可更改,不可添加,不可删除。
仅能读取key和value
6.字典中键值是成对的,不能出现单数元素个数。
// 不可变字典初始化
NSDictionary *d = [[NSDictionary alloc]initWithObjectsAndKeys:@"雪",@"自然1",@"风",@"自然2",@"雨",@"自然3",@"云",@"自然4", nil];
// 获取字典元素(键值对)个数
NSUInteger count = d.count;
NSLog(@"%lu",count);
// 获取所有key值
NSDictionary *d = [[NSDictionary alloc]initWithObjectsAndKeys:@"雪",@"自然1",@"风",@"自然2",@"雨",@"自然3",@"云",@"自然4", nil];
// 获取字典元素(键值对)个数
NSUInteger count = d.count;
NSLog(@"%lu",count);
// 获取所有key值
NSArray *a = d.allKeys;
for (int i = 0; i < d.count; i++) {
NSLog(@"a[%d] = %@",i,a[i]);
NSLog(@"a[%d] = %@",i,a[i]);
}
// 所有value值
NSArray *a1 = d.allValues;
for (int i = 0; i < d.count; i++) {
NSLog(@"a1[%d] = %@",i,a1[i]);
}
// 通过key值查询value
NSString *q = [d valueForKey:@"自然1"];
NSLog(@"自然1 = %@",q);
NSString *q1 = [d valueForKey:@"自然2"];
for (int i = 0; i < d.count; i++) {
NSLog(@"a1[%d] = %@",i,a1[i]);
}
// 通过key值查询value
NSString *q = [d valueForKey:@"自然1"];
NSLog(@"自然1 = %@",q);
NSString *q1 = [d valueForKey:@"自然2"];
NSLog(@"自然2 = %@",q1);
//添加键值对
//自然3就是key 雨就是Value
[n setObject:@"冰" forKey:@"自然5"];
[n
setValue
:
@"
水
"
forKey
:
@"
自然
6
”
];
//修改key对应的Value
[n setValue:@"雾" forKey:@"自然2"];
//删除键值对
[n removeObjectForKey:@"自然1"];
//for循环遍历所有键值对 法1.
NSArray *n3 = n.allKeys;
NSArray *n4 = n.allValues;
for (int i = 0;i < n.count; i++) {
NSLog(@"%@ %@",[n3 objectAtIndex:i],[n4 objectAtIndex:i]);
}
//for循环遍历所有键值对 法2.
NSArray *n5 = [n allKeys];
for (int i = 0; i < n.count; i++) {
NSLog(@"%@,%@", n5[i], [n valueForKey:n5[i]]);
}
setValue:····forKey:
当字典中没有这个key时,setValue:forKey就是添加新的键值对
当字典中有这个key时,setValue:forKey就是修改当前的键值对
问题:加入一个不知道元素类型和个数的集合,如何快速枚举
//id类型格式转化符%@ id(通用类型)泛指所有对象类型,不具体指哪一种类型
for (id ee in qs) {
NSLog(@"%@",ee);
}
iOS中也有表示集合的类,叫做NSSet
集合的特点:
与数学中的集合一样,集合中元素是唯一的(不能重复)
集合中元素是无序存储的
集合中元素类型必须是对象类型(如果基本数据类型需要通过NSNumber、NSValue转化为对象类型)
集合的分类:NSSet、NSMutableSet
NSSet *set = [[NSSet alloc]initWithObjects:@"苹果",@"梨",@"香蕉",@"橘子", nil];
//获取集合元素个数,重复的元素会被覆盖,只算一个
NSLog(@"%lu",set.count);
//获取集合中的某个对象,如果集合中有此元素,就返回,没有就返回nil
NSString *y = [set member:@"ee"];
//for (int i = 0; i < j.count; i++) {
NSLog(@"%@",y);
//}
//containObject 判断集合中是否有这个元素
BOOL is = [set containsObject:@"香蕉"];
NSLog(@"%d",is);
NSArray *all = [set allObjects];
for (int i = 0; i < all.count; i++) {
NSLog(@"%@",all[i]);
}
//anyObject 返回集合中其中一个元素,不保证每次运行的结果都是随机的(第一次是随机的,以后都是固定的)
NSLog(@"%@", [set anyObject]);
NSMutableSet *mu = [[NSMutableSet alloc]initWithObjects:@"banana",@"bear",@"apple",@"orange", nil];
//添加元素
[mu addObject:@"grape"];
//删除元素
[mu removeObject:@"bear"];
NSCountedSet *c = [[NSCountedSet alloc]initWithObjects:@"banana",@"bear",@"apple",@"orange", nil];
NSLog(@"%lu",c.count);
//countForObject计算某个元素在集合内出现的次数
NSInteger c1 = [c countForObject:@"bear"];
NSLog(@"%lu",c1);
NSArray *quick = [NSArray arrayWithObjects:@"生日礼物",@"匆匆那年",@"出卖",@"犯贱", nil];
//右边是数组(集合),左边是集合中元素的类型
for (NSString *str in quick) {
NSLog(@"str = %@",str);
}
//字典的快速枚举
NSDictionary *qu = [NSDictionary dictionaryWithObjectsAndKeys: @"张杰",@"谢娜",@"邓紫棋",@"艾莉",nil];
for (NSString *se in qu) {
NSLog(@"%@",se);
NSLog(@"%@",[qu valueForKey:se]);
}
//快速枚举集合
NSSet *qs = [NSSet setWithObjects:@"那英",@"好声音",@"何炅", @"快乐大本营",nil];
for (NSString *bb in qs) {
NSLog(@"%@",bb);
}
排序:
for (int i = 0; i < sortArray.count;i++) {
for (int j = 0; j < sortArray.count - 1 - i; j++) {
//1.
NSNumber *num1 = [sortArray objectAtIndex:j];
int n1 = [num1 intValue];
NSNumber *num2 = [sortArray objectAtIndex:j+1];
int n2 = [num2 intValue];
if (n1 > n2) {
[sortArray exchangeObjectAtIndex:j withObjectAtIndex:j+1];
}
//2.(简化方法)
// if ([sortArray[j] intValue] > [sortArray[j+1]intValue]) {
// [sortArray exchangeObjectAtIndex:j withObjectAtIndex:j+1];
// }
}
}