黑马程序员技术交流社区

标题: ObjectC----字典类和集合类以及快速枚举和OC中的数组排序 [打印本页]

作者: gd32376300    时间: 2015-12-8 11:28
标题: ObjectC----字典类和集合类以及快速枚举和OC中的数组排序
// 不可变字典
    // 字典是适用于存放键值对的一种集合,里面的元素必须是对象类型
   
    // 字典是无序的
   
    // 字典赋值
    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"guozai",@"name",@"nan",@"sex",@"14",@"age" ,nil];
    // 直接打印字典名就可以
    NSLog(@"%@",dic);
   
    // 取出来的键值都用NSString* 指向
    NSString *age = [dic objectForKey:@"age"];
    NSLog(@"%@",age);
    NSString *nam = [dic objectForKey:@"name"];
    NSLog(@"%@",nam);
   // NSString * sex = [dic objectForKey:@"sex"];
    NSLog(@"%@",[dic objectForKey:@"sex"]);
   
    // 获取所有的key值
    NSArray * keys = [dic allKeys];
    //直接打印数组名
    NSLog(@"%@",keys);
   
    // 获取所有的value值
    NSArray * objects = [dic allValues];
    NSLog(@"%@",objects);
   
   
   
    //=========================================================
    // 可变字典
   
    // 根据已有字典创建新字典
    NSMutableDictionary *mulDic = [NSMutableDictionary dictionaryWithDictionary:dic];
   
    // 添加键值对 score->100
    [mulDic setObject:@"100" forKey:@"score"];
    NSLog(@"%@",mulDic);
   
    // 删除键值对sex->nan
    [mulDic removeObjectForKey:@"sex"];
    NSLog(@"%@",mulDic);
   
    // 修改键值对的值,其实就是添加的方法设置就行
    [mulDic setObject:@"13" forKey:@"age"];
    NSLog(@"%@",mulDic);
    //================================================
    // 遍历字典
   
    NSArray * allkeys = [mulDic allKeys];
    for (int i = 0; i < [allkeys count]; i ++) {
        // 获取下标对应的key
        NSString * key = [allkeys objectAtIndex:i];
        // 根据key获取value
        NSString * value = [mulDic objectForKey:key];
        NSLog(@"%@",value);
    }
   
    // 或则直接用allvalue方法取出所有value
    NSArray * allValue = [mulDic allValues];
    for (int i = 0; i < [mulDic count]; i ++) {
        NSLog(@"%@",[allValue objectAtIndex:i]);
    }
   
    /*
    1字典是适用于存放键值对的一种集合,里面的元素必须是对象类型,
    2字典里面的key时唯一的,不能重复,但是value是可以重复的
    3字典是一种无序集合,键值对顺序不确定,可以将字典理解成“下标是字符串的数组”
    4字典通过key去值,设置值,修改值.遍历时,可以先便利所有的key,然后根据key值遍历value,或者直接通过allvalue方法遍历所有的值。
     */
   
   
    //==============================================================
    // NSSet 集合
   
    // 使用便利构造器定义set
    NSSet *set = [NSSet setWithObjects:@"guozai",@"zaigguo",@"guoguo", nil];
    // 使用初始化方法定义set
    NSSet *set2 = [[NSSet alloc]initWithObjects:@"guozai",@"zaiguo",@"guoguo", nil];
   
    NSLog(@"%@,%@",set,set2);
   
    // 获取所有元素,并打印
    NSArray * sets = [set allObjects];
    NSLog(@"%@",sets);
   
    for (int i = 0; i < [sets count]; i ++) {
        NSLog(@"%@",[sets objectAtIndex:i]);
    }
   
    // 获取set中任意一个元素
   
    NSString *str = [set anyObject];// anyObject方法并不保证随机,一般都是第一个    元素
    NSLog(@"%@",str);
   
    // 判断集合中是否包含某个元素
    BOOL re = [set containsObject:@"guozai"];
    if (re) {
        NSLog(@"baohan");
    }
    else {
        NSLog(@"bubaohan");
    }
   
    //========================================================
    // NSMutableSet
   
    // 根据已有集合创建新的集合
    NSMutableSet * mulSet = [NSMutableSet setWithSet:set];
   
    // 添加元素
    [mulSet addObject:@"zaizai"];
    NSLog(@"%@",mulSet);
   
    // 删除元素
    [mulSet removeObject:@"zaizai"];
    NSLog(@"%@",mulSet);
   
    // ===================================================
   
    // NSCountedSet 是NSMutableSet的子类,可用来计算重复次数
    NSCountedSet *countedSet = [NSCountedSet setWithSet:mulSet];
    [countedSet addObject:@"guozai"];
    NSUInteger count = [countedSet countForObject:@"guozai"];
    NSLog(@"%ld",count);
   
    // ===================================================
    // 在使用快速枚举遍历集合中的元素时,不能对集合里面的元素进行增删操作,否则会崩溃
   
    // 数组的快速枚举
    NSMutableArray * arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
    for (NSString *str in arr) {
        NSLog(@"%@",str);
        // 不能增删
    }
   
    // 字典的快速枚举
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"guozai",@"name",@"man",@"sex",@"19",@"age", nil];
   
    // 字典的快速枚举遍历字典时,遍历的是字典的key;
    for (NSString *str in dict) {
       // NSString *value = [dict objectForKey:str];
       // NSLog(@"%@",value);
        NSLog(@"%@",str);// 打印出来的时key
    }
   
    // 集合的快速枚举
    NSMutableSet * mulSet2 = [NSMutableSet setWithObjects:@"1",@"2", nil];
    for (NSString *str in mulSet2) {
        NSLog(@"%@",str);
    }
   
   
   
  // =======================================================
   
    // sortedArrayUsingSelector会创建一个新的数组,不会影响原数组的元素
    // sortUsingSelector不会创建新的数组,而在原数组的基础上调整元素的位置
   
   
    // 比较方法的定义,比如下面compareByPrice方法在类中的定义
- (NSComparisonResult)compareByPrice:(Student1 *)stu
{
    // 返回NSOrderedDescending==1才交换,返回其他两个不交换
   
    if (_price > [stu price]) {
        return NSOrderedAscending;// ==-1
    }
    else if(_price == [stu price])
    {
        return NSOrderedSame;// ==0
    }
    else      {
        return NSOrderedDescending;
    }
   
}

   
   
    NSArray *sortedArray = [students sortedArrayUsingSelector:
                            @selector(compareByPrice:)];//小括号内是方法名
   
    // 在原数组里面排序用sortUsingSelector@selector()方法
   
    for (Student1 * stu in sortedArray) {
        NSLog(@"%@",stu);
    }
   
   
    // 第一步:在model类中定义比较方法
    // 第二步: 给数组发送排序消息
    // 默认是升序
================================================================================
   NSLog的description方法的重定义,打印对象时实现自己想要的输出
// 打印对象时,会调用对象的description方法
- (NSString *)description
{
   
    NSString *str = [NSString stringWithFormat:@"name = %@,age = %d,score = %.2f",_name ,_age,_score];
    return str;
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2