oc集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oc集合相关的知识,希望对你有一定的参考价值。

 本人之前学习过一年半ios开发 由于行情太过凄惨,故转前端。心在前端,苹果亦难忘!把我平时的笔记作出给大家总结!

 

 

回顾之前的知识
便利初始化函数:框架类库中的一些类有一系列的以init开头的方法,这些方法就是便利初始化函数。例如:NSString的initWithFormat,initWithString等。这些方法都遵循了一个命名规范,就是以init开头。
使用便利初始化函数创建对象首先还是要调用alloc 方法给对象分配内存空间,然后再初始化对象。代码还是比较繁琐的,有没有比较简单创建并初始化对象的方法呢?
Cocoa中,有一些方法通过把内存分配的过程和初始化过程组合起来完成对象的创建,这些方法通常被成为--便利构造器
便利构造函器:命名通常以className开头(类名首字母小写开头),并且都是类方法,例如NSString类的便利构造器:
+(id)stringWithCString(const char *)cString encoding(NSStringEncoding)enc;
+(id)stringWithFormat*(NSString *)format......
进入正题:
总结:这个课就是两种可变的和不可变的(数组、对象、枚举器、字典、set)等。
创建对象,先分配、初始化
老师授课笔记:
可变数组的使用:

        NSMutableArray *arrstu=[NSMutableArray arrayWithCapacity:10];

        student *stu1=[[student alloc]init];

        [email protected]"我";

        student *stu2=[[student alloc]init];

        [email protected]"少";

        student *stu3=[[student alloc]init];

        [email protected]"帅";

        [arrstu addObject:stu1];

        [arrstu addObject:stu2];

        [arrstu addObject:stu3];

 

        [arrstu insertObject:@"兵" atIndex:2];//插入

        [arrstu removeObjectAtIndex:3];//删除

int count ;

        [arrstu replaceObjectAtIndex:2 withObject:@"youxi"];//替换

        

        for(id obj in arrstu)

        {

            NSLog(@"数组对象%d:%@",count,obj);

            count++;

            

        }

课后题目:

1.编写程序,以数组存储字符串”元芳”、”华生”、”平次”,并用循环语句输出数组中存储的所有字符串。

 尝试使用可变数组版本进行程序扩展,可以存放不定项个字符串。

        

        NSArray *array = [NSArray arrayWithObjects:@"元芳", @"华生", @"平次", nil];

        //使用普通循环遍历数组

        NSLog(@"使用普通循环遍历数组:");

        for (int i=0; i<[array count]; i++) {

            NSLog(@"%@",[array objectAtIndex:i]);

        }

        //使用枚举器遍历数组

        NSLog(@"使用枚举器遍历数组:");

        NSEnumerator *objEnumerator = [array objectEnumerator];

        id obj = NULL;

        while (obj = [objEnumerator nextObject]) {

            NSLog(@"%@",obj);

        }

        //使用快速枚举遍历数组

        NSLog(@"使用快速枚举遍历数组:");

        for (id obj in array) {

            NSLog(@"%@",obj);

        }

        NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:3];

        //可变数组中存放元素个数并不受arrayWithCapacity参数值限制,那只是一个最优值

        [mArray addObject:@"元芳"];

        [mArray addObject:@"华生"];

        [mArray addObject:@"平次"];

        [mArray addObject:@"何瑾"];

        [mArray addObject:@"习禁苹"];

        //使用快速枚举遍历可变数组

        NSLog(@"使用快速枚举遍历可变数组:");

        for (id obj in mArray) {

            NSLog(@"%@",obj);

        }

2.编写程序,以可变数组存储1到10之间的不重复的随机整数,再对这个数组进行从小到大排序,最后用循环语句输出所有值。

       @autoreleasepool {

        

        NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:10];

        NSNumber *number = nil;

        int i = 0,j = 0,tmp = 0,value[10] = {0};

        BOOL repeat = NO;

        //获取1到10之间的不重复的随机整数放入value[10]数组中

        for (i=0; i<<span class="s3">10; i++) {

            repeat = NO;

            tmp = (arc4random() % 10) + 1;//获取1到10之间的随机整数

            //以下算法确保生成的随机数不重复

            for (j=0; j

                if (tmp == value[j]) {

                    repeat = YES;//重复了

                    break;

                }

            }

            if (repeat) {

                i -= 1;

            } else {

                value[i] = tmp;

            }

        }

        //装箱1到10之间的随机整数

        for (i=0; i<<span class="s3">10; i++) {

            number = [NSNumber numberWithInt:value[i]];//装箱1到10之间的随机整数

            [mArray addObject:number];//放入可变数组中

        }

        NSLog(@"排序前:");

        for (NSNumber *number in mArray) {

            NSLog(@"%d",[number intValue]);

        }

        [mArray sortUsingSelector:@selector(compare:)];//排序(NSNumber继承NSObject ,可以使用比较compare: isEqual等消息)

        NSLog(@"排序后:");

        for (NSNumber *number in mArray) {

            NSLog(@"%d",[number intValue]);

        }

        

    }

 5.放四个十进制三位数到一个数组中,然后按从小到大排序后组成一个新的数组

3.编写一个学生类,要求学生类有特征:姓名,年龄,性别,学号,成绩,然后分别根据姓名,年龄,成绩进行排序

        //编写一个学生类,要求学生类有特征:姓名,年龄,性别,学号,成绩,然后分别根据姓名,年龄,成绩进行排序

        Student * stu_one = [[Student alloc]init];

        stu_one.name = @"唐僧";

        stu_one.age = 25;

        stu_one.score = 100;

        stu_one.stuID = 1;

        

        Student * stu_two = [[Student alloc]init];

        stu_two.name = @"孙悟空";

        stu_two.age = 30;

        stu_two.score = 95;

        stu_two.stuID = 2;

 

        Student * stu_three = [[Student alloc]init];

        stu_three.name = @"孙悟空";

        stu_three.age = 35;

        stu_three.score = 90;

        stu_three.stuID = 3;

        

        NSArray * stuArray = [[NSArray alloc]initWithObjects:stu_one,stu_two,stu_three, nil];

        //使用不同的排序方式只需要修改关键字

        NSSortDescriptor * sd_stu = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];

        NSArray * sdArray = [NSArray arrayWithObject:sd_stu];

        NSArray * stuArray_last = [stuArray sortedArrayUsingDescriptors:sdArray];

        for(id obj in stuArr)

        {

            NSLog(@"%@",obj);

 

        }

/////////////////////////////////////////////////////////////////////////////////////

@interface Student : NSObject

@property NSString * name;

@property int age;

@property NSString * sex;

@property int stuID;

@property int score;

 

@end

/////////////////////////////////////////////////////////////////////////////////////

#import "Student.h"

 

@implementation Student

-(NSString *)description

{

NSString *string=[NSString stringWithFormat:@"大家好我叫%@,今年%d岁了,性别%@,学号:%d,成绩:%d",_name,_age,_sex,_num,_score];

    return string;

}

@end

/////////////////////////////////////////////////////////////////////////////////////

4.使用可变数组编写一个学生管理系统,可以任意添加,删除,修改 学生的姓名

使用控制台输入数字决定当前要执行的操作,如  1、添加学生姓名 2、删除学生姓名、3.修改学生姓名

     int count;

        NSMutableArray *arrstu=[NSMutableArray arrayWithCapacity:10];

        Student *stu1=[[Student alloc]init];

        [email protected]"少";

        Student *stu2=[[Student alloc]init];

        [email protected]"帅";

        Student *stu3=[[Student alloc]init];

        [email protected]"我";

        [arrstu addObject:stu1];

        [arrstu addObject:stu2];

        [arrstu addObject:stu3];

        int a;

        printf("请输入,你需要的内容:1、添加学生姓名 2、删除学生姓名、3.修改学生姓名");

        scanf("%d",&a);

        switch (a) {

            case 1:

                [arrstu insertObject:@"兵" atIndex:2];

                break;

            case 2:

                [arrstu removeObjectAtIndex:1];//删除

                break;

            case 3:

                [arrstu replaceObjectAtIndex:2 withObject:@"youxi"];//替换

                break;

            default:

                break;

        }

        for(id obj in arrstu)

        {

            NSLog(@"数组对象%d:%@",count,obj);

            count++;

        }

2.

        

        NSString *[email protected]"123-456-789-000";

        NSArray *newArray=[str1 componentsSeparatedByString:@"-"];

        NSLog(@"%@",newArray);

        NSMutableString *newStr=[NSMutableString stringWithCapacity:10];

        for (NSString *s in newArray)// s是指向元素

        {

            [newStr appendString:s];

        }

        NSLog(@"newStr =%@",newStr);

 

        

字典:

        

        //用NSDictionary方法

        NSDictionary *dic=[[NSDictionary alloc] initWithObjectsAndKeys:@"元芳",@"狄仁杰",@"展昭",@"包拯",@"毛利",@"柯南",nil];

        for (NSString *key in [dic allKeys]) {

            NSString *value=[dic valueForKey:key];

           NSLog(@"%@问%@这事你怎么看",key,value);

       }

        //用NSMutableDictionary方法

        NSMutableDictionary *zidian=[[NSMutableDictionary alloc]init];

        detective *det1=[[detective alloc]init];

        [email protected]"元芳";

        detective *det2=[[detective alloc]init];

        [email protected]"展昭";

        detective *det3=[[detective alloc]init];

        [email protected]"毛利";

        [zidian setObject:det1 forKey:@"狄仁杰"];

        [zidian setObject:det2 forKey:@"包拯"];

        [zidian setObject:det3 forKey:@"柯南"];

        

        for (NSString *key in [zidian allKeys]) {

            NSString *value=[zidian valueForKey:key];

            NSLog(@"%@问%@这事你怎么看!",key,value);

 

        }

 

            int num1=333;

        int num2=231;

        int num3=158;

        int num4=998;

        NSMutableArray *arr1=[NSMutableArray arrayWithCapacity:5];

        NSNumber *num_1 =[NSNumber numberWithInt:num1];

        NSNumber *num_2 =[NSNumber numberWithInt:num2];

        NSNumber *num_3 =[NSNumber numberWithInt:num3];

        NSNumber *num_4 =[NSNumber numberWithInt:num4];

        [arr1 addObject: num_1];

        [arr1 addObject: num_2];

        [arr1 addObject: num_3];

        [arr1 addObject: num_4];

        [arr1 sortUsingSelector:@selector(compare:)];

        for (id obj in arr1) {

            NSLog(@"%@",obj);

        }

 

              //取出符串“123-456-789-000”中的数字部分,组成一个新的字符串输出,(提示:可变字符串;返回数组) 

        NSString *[email protected]"123-456-789-000";

        NSArray *newArray=[str1 componentsSeparatedByString:@"-"];

        NSLog(@"%@",newArray);

        NSMutableString *newStr=[NSMutableString stringWithCapacity:10];

        for (NSString *s in newArray)// s是指向元素

        {

            [newStr appendString:s];

        }

        NSLog(@"newStr =%@",newStr);

字典讲解:

///////////////////////////////////////////////////////////////////////////////////////

#import

#import "Student.h"

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        Student * stu_1 = [[Student alloc]init];

        Student * stu_2 = [[Student alloc]init];

        Student * stu_3 = [[Student alloc]init];

        Student * stu_4 = [[Student alloc]init];

        //使用不可变字典时,必须在创建时指定字典内元素

        //注意:作为字典的关键字必须要遵循NSCopying协议

        //字典内元素必须成对出现,元素个数永远只有偶数个

        //字典中对象的关键字必须唯一

        //不可变字典一经创建不可修改

        //遍历字典时一定要注意遍历出来的元素顺序

        NSDictionary * stuDic = [NSDictionary dictionaryWithObjectsAndKeys:stu_1,@"stu1",stu_2,@"stu2",stu_3,@"stu3",stu_4,@"stu4", nil];

        NSLog(@"stuDic = %@",[stuDic objectForKey:@"stu3"]);

      

        NSMutableDictionary * mutDic = [[NSMutableDictionary alloc]init];

        //为可变字典添加元素

        [mutDic setObject:stu_1 forKey:@"stu1"];

        [mutDic setObject:stu_2 forKey:@"stu2"];

        NSLog(@"mutDic = %@",mutDic);

        //删除可变字典指定元素

        [mutDic removeObjectForKey:@"stu1"];

        [mutDic setObject:stu_3 forKey:@"stu1"];

        [mutDic setDictionary:stuDic];

        NSLog(@"mutDic = %@",mutDic);

        //集合的特点,元素无序

        //元素唯一

        //(自学NSMutbaleSet)

       

        //NSNumber 是对C语言中数据类型的封装,可以将c数据类型转换为OC的对象,以方便存放到数组等集合当中

        //数据一旦进行转换后,将不再支持算数运算,因为变成了对象

        //注意明确转换前后的数据类型对应

        int num1 = 65;

        int num2 = 20;

        NSNumber * intNum = [NSNumber numberWithInt:num1];

        NSNumber * intNum2 = [NSNumber numberWithInt:num2];

        int tmpint = [intNum intValue];

        NSLog(@"%d",tmpint);

        NSLog(@"%@",intNum);

        

        //NSValue

        NSRect rect = NSMakeRect(0, 0, 320, 480);

        NSValue * rectValue = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)];

        NSSize size = NSMakeSize(20, 20);

        NSValue * sizeValue = [NSValue valueWithSize:size];

        NSLog(@"rectValue = %@",rectValue);

        NSLog(@"sizeValue = %@",sizeValue);

        //使用getValue取值时,参数是要存放值得变量

        NSSize tmpsize;

        [sizeValue getValue:&tmpsize];

        NSLog(@"%f",tmpsize.width);

        //(自学NSNull)

        //创建空对象,主要用途,数组占位

    }

    return 0;

}

////////////////////////////////////////////////////////////////////////////////////////

#import

 

@interface Student : NSObject

 

 

@end

///////////////////////////////////////////////////////////////////////////////////////

 

#import "Student.h"

 

@implementation Student

 

 

@end

///////////////////////////////////////////////////////////////////////////////////////

以上是关于oc集合的主要内容,如果未能解决你的问题,请参考以下文章

OC6(集合)

OC Foundation 集合简述

OC - 数组字典集合

39-oc集合中对象的内存管理

OC第六节 遍历集合数组排序

OC Foundation框架 有序集合