OC - 集合类

这篇博客介绍了Objective-C中的集合类,包括NSArray的不可变性和NSMutableArray的可变操作,详细讲解了初始化、元素获取、排序及遍历等方法。同时,对NSDictionary和NSMutableDictionary的使用进行了阐述,强调了键的唯一性和字典的操作特点。最后,还涵盖了NSSet的集合概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

  • 1.集合类简介
  • 2.NSArray(不可变数组)
  • 3.NSMutableArray (可变数组)
  • 4.NSDictionary
  • 5.NSMutableDictionary
  • 6.字典的遍历
  • 7.NSSet(集)

一、集合类简介

在C语言阶段大家听到集合类,肯定会想到数组,但是在OC语言的集合不在是单纯的数组,而是分为三大类:数组NSArray,字典NSDictionary,集NSSet;平常使用的集合都是这3类,或者他们的子类;

OC集合类的特点

1.所有集合都是对象;
2.集合中的元素都是对象,而且只能是对象;
3.简单数据类型用NSNumber封装成对象,复杂数据类型用NSValue封装;
4.集合中不能存放nil空对象,nil是作为集合结束标识符;
5.OC集合没有多维的概念,也就是不会出现根本意义上的二维数组,我们可以简单的这样理解:在数组中存放了一个对象,这个对象是数组;
6.集合的所有运算依赖于方法,但是多数情况下依旧要使用循环。

二、NSArray

NSArray介绍

1.OC中数组分为不可变数组(NSArray)和可变数组(NSMutableArray) ,且只能存储Object-C对象

2.NSArray是不可变数组,数组存放的对象个数和每个对象都不可改。

3.只能装对象,基本数据类型封装成NSNumber,复杂类型封装成NSValue;

4.nil作为结束标志,初始化中不能包含空对象;

5.数组中的元素不一定为一个类型,可以NSString,NSNumber

6.下表从0开始
 NSArrayNSString一样是不可变,他的操作不再原数组上进行,通过返回一个新数组来操作,接下来我们看看NSArray的一些方法

1.初始化方法

//实例方法初始化:initWith....
        NSArray *array1 = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
        NSArray *array2 = [[NSArray alloc] initWithArray:array1];

//便利初始化方法:arrayWith....
        NSArray *array3 = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
        NSArray *array4 = [NSArray arrayWithArray:array3];
//简化操作:@[]
        NSArray *array5 = @[@"1",@"2",@"3"];

2.获取数组元素个数

   NSArray *array5 = @[@"1",@"2",@"3"];
   NSInteger count = [array5 count];
   NSLog(@"count = %ld",count);

3.数组的常用方法

  1.添加元素
  NSArray *array1 = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];

  NSArray *addArray = [array1 arrayByAddingObject:@"4"];

  NSArray *addArray1 = [array1 arrayByAddingObjectsFromArray:array3];

  NSLog(@"addArray = %@,addArray1 = %@",addArray,addArray1);
  2.查找元素
  NSArray *array3 = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];

  NSInteger index = [array3 indexOfObject:@"3"];
  if (index == NSNotFound) {
         NSLog(@"没有这个对象");
     } else {
         NSLog(@"找到对象了:%ld", index);
      }
 3.获取元素
存入是什么类型,取出的时候,就需要什么类型去接受

//根据索引:objectAtIndex,arr[i]
  NSArray *array1 = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];

  NSString *getString1 = array1[0];
  NSString *getString2 = [array1 objectAtIndex:0]; 
             NSLog(@"getString:%@,%@",getString1,getString2);
  //获取第一个: firstObject
   NSString *getString3 = [array1 firstObject];

   //获取最后一个:lastObject
   NSString *getString4 = [array1 lastObject];

   NSLog(@"%@,%@",getString3,getString4);
   //获取部分元素:subarrayWithRange...
    NSArray *getArray = [array1 subarrayWithRange:NSMakeRange(0, 2)];
    NSLog(@"getArray = %@",getArray);

4.排序

 NSOrderedSame;         0    相等
 NSOrderedDescending;   -1   降序
 NSOrderedAscending;     1   升序
//sortedArrayUsingSelector:@selector(compare:):他是以字符串(ASCII)的形式比较大小的

NSArray *sortArray = @[@"3",@"7",@"5"];

NSArray *sortArray1 = [sortArray sortedArrayUsingSelector:@selector(compare:)]; 

NSLog(@"sortArray = %@",sortArray1);//3,7,5
//如果我在数组里面我加了一个17,如果用上面的方式,结果是:17,3,5,7,解决方法是将其转变为interger或int类型比较,方法:sortedArrayUsingComparator

NSArray *sortArray = @[@"3",@"7",@"5",@"17"];      
NSArray *sortArray2 = [sortArray sortedArrayUsingComparator:^NSComparisonResult(id  __nonnull obj1, id  __nonnull obj2) {
            NSInteger a = [obj1 integerValue];
            NSInteger b = [obj2 integerValue];
            if (a == b) {
                return 0;
            }else if (a > b){
                return 1;
            }else{
                return -1;
            }
        }];
        NSLog(@"sortArray2 = %@",sortArray2);
        //结果:3,5,7,17
有人可能会问,那我想从大到小呢:只需改一下return后面的数

NSArray *sortArray2 = [sortArray sortedArrayUsingComparator:^NSComparisonResult(id  __nonnull obj1, id  __nonnull obj2) {
            NSInteger a = [obj1 integerValue];
            NSInteger b = [obj2 integerValue];
            if (a == b) {
                return 0;
            }else if (a > b){
                return -1;
            }else{
                return 1;
            }
        }];
        NSLog(@"sortArray2 = %@",sortArray2);
        //结果:17,7,5,3

5.数组的遍历

//一般遍历方法
    NSArray *newArray = @[@"2",@"5",@"1",@"8",@"4"];
    for (int i = 0; i < [newArray count]; i ++) {
        NSLog(@"newArray = %@",[newArray objectAtIndex:i]);
      }
  //快速枚举
     for (id obj in newArray) {
         NSLog(@"obj = %@",obj);
    }

三、NSMutableArray(可变数组)

可变数组NSMutableArray,继承自NSArray,拥有父类的全部特性;

NSMutableArray的方法,直接对数组自身进行操作,没有返回值。

1.初始化

 NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithObjects:@"3",@"7",@"6",@"5", nil];    

  NSMutableArray *mutableArray1 = [NSMutableArray arrayWithObjects:@"2",@"4",@"7", nil];

 NSMutableArray *arr = [NSMutableArray arrayWithCapacity:20];//给它分配容量大小

2.方法运算

  1.增
    NSMutableArray *mutableArray1 = [NSMutableArray arrayWithObjects:@"2",@"4",@"7", nil];
    [mutableArray1 addObject:@"0"];
    NSLog(@"mutableArray1 = %@",mutableArray1);
 2.删
   [mutableArray1 removeObject:@"2"];
    NSLog(@"remove = %@",mutableArray1);
 3.查
  NSInteger index1 = [mutableArray1 indexOfObject:@"0"];

  NSLog(@"index1 = %ld",index1);
4.改(替换)
 [mutableArray1 replaceObjectAtIndex:2 withObject:@"1"];

NSLog(@"replace = %@",mutableArray1);
5.排序: sort...
    NSMutableArray *arr2 = [NSMutableArray arrayWithObjects:@"1",
                 @"3",
                 @"2",nil];
    [arr2 sortUsingSelector:@selector(compare:)];
    NSLog(@"%@", arr2);

四、NSDictionary(字典)

存储方式为通过 键-值 对(key - value)的方式来存放数据的一种无序集合。

字典使用的是键查询的优化存储方式。它可以立即找出要查询的数据,而不需要遍历整个数组进行查找。

 一般通过key来操作object。某种意义上,对字典的运算实际上就是对key值的运算。

 字典分为不可变字典NSDictionary和可变字典NSMutableDictionary。

1.初始化

//一般初始化方法(value:key)
NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2",nil];

//便利初始化方法
NSDictionary *dictionary1 = [NSDictionary dictionaryWithObjectsAndKeys:@"one",@"1",@"two",@"2", nil];

NSLog(@"dic:%@,%@",dictionary,dictionary1);

//字典的快速生成:@{key - value}
 NSDictionary *dictionary2 = @{@"1":@"one",
                                @"2":@"two"};
 NSLog(@"dic2 = %@",dictionary2);

2.查询一个对象(通过key)

   id object = [dictionary2 objectForKey:@"2"];
 NSLog(@"object = %@",object);

3.取出所有的key

    NSArray *keys = [dictionary2 allKeys];

4.取出所有的对象

 NSArray *objects = [dictionary2 allValues];
NSLog(@"keys = %@,objects = %@",keys,objects);

*

注意:键不可以重复,值可以 当设置的key值与原有key值重复时,会直接覆盖原来的键值对,这 也是更改字典数据的方法。

*

五、NSMutableDictionary(可变字典)

1.初始化

    NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"three",@"3",@"four",@"4", nil];

2.增

 [mutableDictionary setObject:@"six" forKey:@"6"];
NSLog(@"addDic:%@",mutableDictionary);

3.删

 [mutableDictionary removeObjectForKey:@"6"];
NSLog(@"%@",mutableDictionary);

4.查

id obj1 = [mutableDictionary objectForKey:@"4"];
NSLog(@"%@",obj1);

5.改(根据key将原来的覆盖掉)

[mutableDictionary setObject:@"sunny" forKey:@"4"];
NSLog(@"change = %@",mutableDictionary);

六、字典的遍历

因为字典是以key-value形式存在,所以不可以直接遍历出一对,只能通过keys 
//for循环遍历
   NSDictionary *newDictionary = @{@"1":@"one",
                                    @"2":@"two",
                                  @"3":@"three",
                                 @"4":@"four"};

   NSArray *allKeys = [newDictionary allKeys]; 

    //根据key,遍历所有的value
  for (int j = 0; j < [allKeys count]; j ++) {
      NSString *key = [allKeys objectAtIndex:i];
      NSLog(@"%@", [dic objectForKey:key]);

     }
  // 快速枚举
        for (id key in dic1) {
  //快速枚举字典拿到的是key
     NSLog(@"%@", [dic1 objectForKey:key]);

        }

七、 NSSet(集)

 完全无序

 里面的对象不能存放重复对象主要用于去除重复数

 NSSet对象中不能存放重复对象,如果出现重复,最终只会保留一个,NSSet也常用来清除其他集合中的重复对象
 //初始化
 NSSet *set = [NSSet setWithObjects:@"1",@"2",@"3",@"4", nil];

 //取出一个
 id obi2 = [set anyObject];

 //取所有的对象
 NSArray *setArray = [set allObjects];
 NSLog(@"%@,setArray = %@",obi2,setArray);
//去除重复数
 NSArray *setArray1 = @[@"1",@"2",@"3",@"4",@"4",@"3"];

 NSSet *set1 = [NSSet setWithArray:setArray1];

 NSArray *setArray2 = [set1 allObjects];
 NSLog(@"setArray2 = %@",setArray2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值