OC语言-Foundation-NSArray,NSSet,NSDictionary及它们的Mutable延伸

关于这三大集合类,他们本身就能实现很多功能,但若不了解的话,可能会盲目的自己写,今天总结一下常用的.

简介

  • NSArray是对象的有序集合(可存储不同类型的对象),在内存中存储位置是连续的
  • NSSet是对象的无序集合(可存储不同类型的对象),在内存中存储方式是不连续的
  • NSDictionary是键值对的集合(可存储不同类型的对象),注意key在整个字典中是唯一的,若多个key相等,也只能取出一个
    以上三种集合类一旦初始化后,就不可改变.对应三种可变集合类
    NSMutableArray
    NSMutableSet
    NSMutableDictionary
    注意:
  1. 这些集合类只能收集NSObject对象,如果想保存基本数据类型,需要封装成NSNumber对象.
  2. 打印的时候注意,NSLog不支持中文

** NSArray和NSSet的主要区别是,在搜索元素时, NSSet效率较高**
NSArray:若要查找元素A是否在数组,需要遍历整个数组
NSSet:查找时用到了ha'sh算法(散列,也称哈希),不论是插入还是查找,一个hash过程就能找到A存储的位置

个人感觉我们的NSArray就是C中的数组, NSSet就是C中的链表, NSDictionary就是C中的map

  • 数组:查找时需要遍历数组,速度较慢,不可变数组也可以添加元素,但本质是销毁原来的数组,生成一个新的数组.
  • 链表:每个元素都有个前指针和后指针,能快速的移动或删除

共性

继承 : NSObject
实现协议 : <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>
下面分别介绍各个的常用方法

NSArray及NSMutableArray
NSMutableArray : NSArray

类型
NSArray是基于C底层CFArray/CFArrayRef实现的,NSArray 可以看做是一个 CFArrayRef 的 Wrapper类.
NSArray的真正类型是__NSArrayI(Immutable)
NSMutableArray的真正类型是__NSArrayM(_internal)

NSArray类

初始化,计算长度,按下标取值
- (instancetype)init;
@property (readonly) NSUInteger count;
- (ObjectType)objectAtIndex:(NSUInteger)index;
//初始化的几种方法
NSArray *arr = [[NSArray alloc] initWithObjects:@”1”, @”2”, nil]; 
NSArray * arr =[NSArray arrayWithObjects:@”1”,@”2”,nil];
NSArray * arr =@[@“1”,@”2”]; 

NSArray(NSExtendedArray)类别

//在当前数组中追加一个新的对象,返回一个新的数组对象
- (NSArray<ObjectType> *)arrayByAddingObject:(ObjectType)anObject;
//在某一数组A后追加一新的数组B,返回一个新的数组C
- (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray;
//用你输入的separator字符,分割当前数组,返回一串字符串,假如数组内容为@"1",@"2",@"3", nil 若separator为!!!,则输出字符串为1!!!2!!!3!!!
- (NSString *)componentsJoinedByString:(NSString *)separator;
//检测数组中是否包含指定数据,包含返回YES,不包含返回NO
- (BOOL)containsObject:(ObjectType)anObject;
//数组A和数组B比较,数组A的对象按顺序遍历数组B全部对象,返回数组B和数组A第一个相同的元素,若均不相同,返回null
- (nullable ObjectType)firstObjectCommonWithArray:(NSArray<ObjectType> *)otherArray;
//判定某一对象是否存在于数组中,若存在,返回的就是对象下标,不存在返回的是一长串数字,可将返回值和NSNotFound对比,将返回的一长串数字改为提醒
- (NSUInteger)indexOfObject:(ObjectType)anObject;
//判定某一对象是否存在于数组某一范围中(只在此范围内差查找),若存在则返回下标,不存在返回NSNotFound
- (NSUInteger)indexOfObject:(ObjectType)anObject inRange:(NSRange)range;
    //示例
    if([arr indexOfObject:@"3" inRange:NSMakeRange(2,2)] == NSNotFound)
        NSLog(@"未找到");
    else
        NSLog(@"%lu",[arr indexOfObject:@"3" inRange:NSMakeRange(2,2)]);
//比较两个数组是否相同,长度和内容都相同返回YES,否则返回NO
- (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray;
//获取数组第一个元素和最后一个元素,若数组只初始化未赋值,返回null
@property (nullable, nonatomic, readonly) ObjectType firstObject;
@property (nullable, nonatomic, readonly) ObjectType lastObject;


description说明
NSLog函数进行打印的时候会自动调用description方法,默认情况下,NSLog和%@输出对象时返回的是类名和内存地址,我们可以重写对象的description方法.
** NSMutableArray类**
添加

//尾部添加一个元素
- (void)addObject:(ObjectType)anObject;
//尾部添加一个数组
- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;

插入

//在指定索引处插入一个元素,原来的元素后移 
- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
//在指定索引集合处插入一个数组元素,相当于批次insertObject: atIndex:
- (void)insertObjects:(NSArray<ObjectType> *)objects atIndexes:(NSIndexSet *)indexes;

移除

//移除最后一位
(void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
//按指定索引移除
(void)removeObjectAtIndex:(NSUInteger)index;
//移除全部
(void)removeAllObjects;
//若数组某一范围内有元素anObject,则移除
(void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
//移除你指定的元素anObject,若数组中没有,则不移除
(void)removeObject:(ObjectType)anObject;
//移除和otherArray中共同的元素
- (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray;
//移除数组某一范围
- (void)removeObjectsInRange:(NSRange)range;

替换

//替换对应索引位置的元素
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
//交换对应索引位置的元素
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
//等效于先removeAllObjects后addObjectsFromArray 
- (void)setArray:(NSArray<ObjectType> *)otherArray;

NSSet和NSMutableSet
NSMutableSet : NSSet

** NSSet类**
初始化

//类方法
//不赋值初始化
+ (instancetype)set;
//单个元素初始化
+ (instancetype)setWithObject:(ObjectType)object;
//多个元素初始化
+ (instancetype)setWithObjects:(ObjectType)firstObj;
//其他set对象初始化
+ (instancetype)setWithSet:(NSSet<ObjectType> *)set;
//数组对象初始化
+ (instancetype)setWithArray:(NSArray<ObjectType> *)array;
//相对应的对象方法
- (instancetype)initWithObjects:(ObjectType)firstObj;
- (instancetype)initWithSet:(NSSet<ObjectType> *)set;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array;

其他常用方法

//以数组的形式获取集合中的所有对象  
@property (readonly, copy) NSArray<ObjectType> *allObjects;
        NSArray *allObj = [set allObjects];  
        NSLog(@"allObj :%@", allObj); 
//获取任意一个元素,但每次实验都是获取第一个元素
- (nullable ObjectType)anyObject;
//判断是否包含anObject
- (BOOL)containsObject:(ObjectType)anObject;
//判断两个set是否相等
- (BOOL)isEqualToSet:(NSSet<ObjectType> *)otherSet;
//判断set是否是otherSet的子集
- (BOOL)isSubsetOfSet:(NSSet<ObjectType> *)otherSet;

** NSMutableSet类**
添加

//添加对象
- (void)addObject:(ObjectType)object;
//向集合中添加另一集合,重复的对象只会有一个(合并集合)
- (void)unionSet:(NSSet<ObjectType> *)otherSet;

删除

//删除某一元素
- (void)removeObject:(ObjectType)object;
//删除全部
- (void)removeAllObjects;
//向集合中删除另一个集合出现的元素
- (void)minusSet:(NSSet<ObjectType> *)otherSet;
//向集合中删除另一个集合没出现的元素(只留下相等元素)
- (void)intersectSet:(NSSet<ObjectType> *)otherSet;

NSDictionary和NSMutableDictionary

NSMutableDictionary : NSDictionary

** NSDictionary类**
初始化

- (instancetype)initWithObjectsAndKeys:(id)firstObject;
- (instancetype)init;
- (instancetype)initWithObjects:(const ObjectType [])objects forKeys:(const KeyType [])keys count:(NSUInteger)cnt;

取值

//获得所有key值
@property (readonly, copy) NSArray<KeyType> *allKeys;
//获得所有Value值
@property (readonly, copy) NSArray<ObjectType> *allValues;
//根据key值取value
- (nullable ObjectType)objectForKey:(KeyType)aKey;
//取出Value的全部key值
- (NSArray<KeyType> *)allKeysForObject:(ObjectType)anObject;

其他

//将字典的key变成一个枚举对象用于遍历
- (NSEnumerator<KeyType> *)keyEnumerator;
//快速枚举
    for(id key in dic)
    {
        NSLog(@"key: %@,value: %@",key,[dic objectForKey:key]);
    }

** NSMutableDictionary类**
取值

- (nullable ObjectType)objectForKey:(KeyType)aKey;

增加

//若无此键,直接增加,若有,则更改键的内容
- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;
//将原字典清空,再赋给他新字典
- (void)setDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;
//将两个字典拼接成一个字典
- (void)addEntriesFromDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;

删除

//删除某一元素,key
- (void)removeObjectForKey:(KeyType)aKey;
//删除部分元素(数组中有的)
- (void)removeObjectsForKeys:(NSArray<KeyType> *)keyArray;
//删除全部
- (void)removeAllObjects;

其他

使用本地文件内容创建可变字典
- (nullable NSMutableDictionary<KeyType, ObjectType> *)initWithContentsOfFile:(NSString *)path;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容