字典用于保存具有映射关系(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];
// }
}
}