您的位置:首页 > 移动开发 > Objective-C

Objective-C---5---字典,集合

2015-09-29 14:40 369 查看

1. 字典:

1.1 不可变字典:

1.1.1 不可变字典的创建:

#pragma mark-------不可变字典
{
// NSDictionary 字典:一个索引对应一个值
// 一旦创建,不可改变
// 1. 创建一个空字典:创建不可变的空字典是无意义的
NSDictionary *dic1 = [NSDictionary dictionary];

// 2. 创建一组键值对的字典:
//key:zw     value:zhangwei
NSDictionary *dic2 = [NSDictionary dictionaryWithObject:@"zhangwei" forKey:@"zw"];

// 3. 创建多组键值对的字典:-----<span style="color:#CC0000;">这个创建方法是先写value   再写key</span>
NSDictionary *dic3 = [NSDictionary dictionaryWithObjectsAndKeys:@"one", @"k1", @"two", @"k2", @"three", @"k3", nil];
/*
字典中的元素是以键值对的形式存储的,@“one”和@“k1”组成一组键值对
键值对的值(value)和键(key),可以是(id)任意的对象,键通常是字符串
字典和数组一样,存储的是对象的地址,但是数组中对象的地址是有序的,字典中对象地址是无序的
*/

NSLog(@"%@",dic1);
NSLog(@"%@",dic2);
NSLog(@"%@",dic3);

// 4. 快速创建一个字典:-----<span style="color:#CC0000;">这个创建方法是先写key  后写value</span>
// @{... key键:value值...}成对出现,
// key键不能重复,若重复不会报错,但是后写入的key键不显示。
NSDictionary *dic5 = @{
@"zhc":@"zhanghongchao",
@"lb":@"liubo",
@"lb":@"libo",
@"lyc":@"liyachao"
};
NSLog(@"%@", dic5);
}


1.1.2 不可变字典的基本用法:

#pragma mark-------字典的基本用法
{
NSDictionary *dic4 = @{
@"zsf":@"zhangsanfeng",
@"lhl":@"liuhulan",
@"xlz":@"xiaolizi",
@"xlfd":@"xiaolifeidao"
};
NSLog(@"%@", dic4);
// 1. 获取字典的元素个数
NSLog(@"%ld", [dic4 count]);

// 2. 根据key键获取value值
NSString *str = [dic4 objectForKey:@"xlz"];
NSLog(@"%@", str);

// 3.1 遍历: for循环,首先遍历出来的是key------再通过key寻找value
for (NSString *key in dic4) {
NSLog(@"%@", key);

NSString *s = [dic4 objectForKey:key]; // 根据key遍历value
NSLog(@"%@", s);
}

// 3.2 遍历2:
NSEnumerator *enumrator = [dic4 keyEnumerator];
id obj;
while (obj = [enumrator nextObject]) {
NSLog(@"%@", obj);
NSString *s = [dic4 objectForKey:obj];
NSLog(@"%@", s);
}

// 3.3 遍历3:
<span style="color:#CC0000;">[dic4 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@, %@", key, obj);</span>
}];

// 4. 创建及获取简单用法:
NSDictionary *dic = @{@"zw":@"zhangwei", @"zsf":@"zhangsanfeng", @"dc":@"dengchao", @"hzw":@"haizeiwang"};
NSLog(@"%@", dic[@"hzw"]);

//  5. 读写文件
BOOL isWrite = [dic writeToFile:@"/Users/lanou3g/Desktop/dic.plist" atomically:YES];
// @"/Users/lanou3g/Desktop/dic.plist" 这一堆指的是你的文件存放的路径
if (isWrite) {
NSLog(@"成功");
}else{
NSLog(@"失败");
}
<span style="color:#CC0000;">NSDictionary *readDic = [NSDictionary dictionaryWithContentsOfFile:@"/Users/lanou3g/Desktop/dic.plist"];
//  读完之后遍历   也可以直接打印的时候读取
NSLog(@"%@", readDic);</span>
}


练习:

#pragma mark-------练习
/*
山东菜    煎饼、扒鸡
东北菜    杀猪菜、大拌菜

*/
{
NSArray *sdArray = [NSArray arrayWithObjects:@"jianbing", @"paji", nil];
NSArray *dbArray = [NSArray arrayWithObjects:@"shazhucai", @"dabancai", nil];
NSDictionary *menu = @{@"sdc":sdArray, @"dbc":dbArray};
NSLog(@"%@", menu);

[menu writeToFile:@"/Users/lanou3g/Desktop/menu.plist" atomically:YES];
NSLog(@"%@",[NSDictionary dictionaryWithContentsOfFile:@"/Users/lanou3g/Desktop/menu.plist"]);
}


1.2 可变字典:

#pragma mark-------可变字典
{
// NSMutableDictionary 继承父类NSDictionary的方法
// 1. 创建空字典:
NSMutableDictionary *dic = [NSMutableDictionary dictionary];

// 2. 创建指定长度的字典:
NSMutableDictionary *dic1 = [NSMutableDictionary dictionaryWithCapacity:3];

// 3.1 给可变字典添加键值对:
[dic setValue:@"haojian" forKey:@"hj"];
[dic setValue:@"chunxiao" forKey:@"cx"];
[dic setValue:@"jianbingxia" forKey:@"jbx"];

// 3.2 删除
[dic removeObjectForKey:@"cx"];
NSLog(@"%@", dic);

// 3.3 改值,根据key改value
[dic setObject:@"chengxue" forKey:@"cx"];
dic[@"cx"] = @"chunxiao"; // 简单的修改方法
NSLog(@"%@", dic);

// 3.4 通过利用数组接收key值  来判断是否包含某个键值
NSArray *arr = [dic allKeys];
if ([arr containsObject:@"zj"]) {
NSLog(@"包含");
}else
NSLog(@"不包含");

/*
<span style="color:#CC0000;">数组创建通过[],访问通过下标;
字典创建通过{},访问通过key</span>
*/
}


2. 集合

2.1 NSSet:

{

//  NSSet集合: 采用一种算法,可以快速的找到集合中的元素  数组有序   集合无序
//  集合中存储的元素是对象

//  1. 创建一个集合
NSSet *set = [[NSSet alloc] initWithObjects:@"one", @"two", @"three", @"four", nil];
NSLog(@"%@",set);

//  2. 获取集合中元素个数
NSLog(@"%ld", set.count);

//  3. 获取集合中的第一个元素
NSLog(@"%@", [set anyObject]);

//  4. 查找元素是否包含在集合中
BOOL res = [set containsObject:@"one"];
NSLog(@"%d",res);

//   5.1 判断两个集合是否相等
//   判断的时候,只要元素一样就可以啦,顺序不一样也是相同的,不可以重复录入
NSSet *set2 = [[NSSet alloc] initWithObjects:@"four", @"two", @"three", @"one", @"one", nil];
BOOL res2 = [set isEqualToSet:set2];
if (res2) {
NSLog(@"same"); //  结果输出是same  因为重复的不会被写入,只写一个 所以set与set2一样
}else{
NSLog(@"no");
}

//  5.2 判断set与set2的子集合:
BOOL res3 = [set isSubsetOfSet:set2];
NSLog(@"%d",res3); //  set与set2的子集合是相等的   set2包含了set里的内容...

//  6. 遍历 <span style="color:#CC0000;">通过枚举器</span>
NSEnumerator *enumrator = [set objectEnumerator];
NSString *str;
while (str = [enumrator nextObject]) {
NSLog(@"%@", str);
}
[set release];
[set2 release];
}


数组与集合:

{
//  1. 通过数组创建集合: 创建数组---赋给集合
NSArray *array = [NSArray arrayWithObjects:@1, @2, @3, @4, @5, nil];
NSSet *set = [NSSet setWithArray:array];
NSLog(@"%@",set);

//  2. 使用数组接收集合中的元素   取出元素---赋给数组
NSArray *array1 = [set allObjects];
NSLog(@"%@",array1);
}


2.2 可变集合:NSMutableSet

#pragma mark---------可变集合
{
//  创建空集合
NSMutableSet *set = [NSMutableSet set];

//  添加单个元素
[set addObject:@1];
[set addObject:@2];
[set addObject:@3];
[set addObject:@4];
NSLog(@"%@", set);

//  添加多个元素
NSSet *set2 = [NSSet setWithObjects:@5, @6, @7, nil];
[set unionSet:set2]; // <span style="color:#990000;">将set2中的元素给set</span>
NSLog(@"%@",set);

[set minusSet:set2];  // <span style="color:#990000;">从set中删除set2的内容</span>
NSLog(@"%@",set);

//  删除
[set removeObject:@1];
NSLog(@"%@",set);
}


2.3 NSCountedSet:

能记录集合中元素重复次数:

在set的基础上添加了计数功能:

#pragma mark---------NSCountedSet
{
// 创建一个NSCountedSet对象
NSCountedSet *countedset = [NSCountedSet setWithObjects:@1, @2, @3, @4, @5, @2, @3, @6, @4, nil];
NSLog(@"%@", countedset);

// <span style="color:#990000;">记录某个元素出现的次数:</span>
NSUInteger count = [countedset countForObject:@3];
NSLog(@"%lu", count);
}


3. 快速枚举:

for (<#type *object#> in <#collection#>) {
<#statements#>
}
object是遍历得到的元素对象。

collection是集合类型的对象:数组、字典、集合。

数组枚举:得到数组中的元素对象。

字典枚举:得到字典中的key值。

集合枚举:得到集合中的元素对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: