【阅读笔记】OC类库-NSArray,NSSet,NSDicti
关于这三大集合类,他们本身就能实现很多功能,但若不了解的话,可能会盲目的自己写,今天总结一下常用的.
简介
- NSArray是对象的有序集合(可存储不同类型的对象),在内存中存储位置是连续的
- NSSet是对象的无序集合(可存储不同类型的对象),在内存中存储方式是不连续的
- NSDictionary是键值对的集合(可存储不同类型的对象),注意key在整个字典中是唯一的,若多个key相等,也只能取出一个
以上三种集合类一旦初始化后,就不可改变.对应三种可变集合类
NSMutableArray
NSMutableSet
NSMutableDictionary
注意:
- 这些集合类只能收集NSObject对象,如果想保存基本数据类型,需要封装成NSNumber对象.
- 打印的时候注意,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;