Foundation框架中的集合框架


Foundation框架中的集合框架

内容概述

  • 数组NSArray和NSMutableArray
  • 集合NSSet和NSMutableSet
  • 字典NSDictionary和NSMutableDictionary

13.1 数组NSArray和NSMutableArray

NSArray是一个不可变数组,可以用来容纳多个有序对象的集合,NSMutableArray继承NSArray可以创建一个可变数组用来容纳多个有序对象。数组常用操作包括创建、查找、比较和排序等。

  1. 创建(初始化)数组。常用的初始化方法包括:+ (id)arrayWithObjects:(id)firstObj, ...传递一个对象列表参数,也可以通过一个已经存在的数组进行初始化+ (id)arrayWithArray:(NSArray )anArray,还可以通过直接赋值的方法NSArray array = @["A","B","C"];
// 直接赋值初始化

NSArray *array = @[@"A",@"B",@"C"];

// 使用已经存在的数组进行初始化

NSArray *array2 = [NSArray arrayWithArray:array];

// 使用对象集合进行初始化

NSArray *array3 = [NSArray arrayWithObjects:@"A",@"B",@"C", nil];
  1. 查找数组中的对象。可以通过索引直接查找,也可以获得数组的大小,循环遍历查找。
// 获得某个索引位置的元素

NSString *obj = [array objectAtIndex:0];

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

// 判断是否包含某个元素

BOOL result = [array containsObject:@"B"];

if (result) {

    NSLog(@"contains");

}else{

    NSLog(@"not contains");

}

// 获得数组大小

NSUInteger count = [array count];

NSLog(@"count=%lu",count);

// 遍历数组

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

    NSString *obj = [array objectAtIndex:i];

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

}

// 遍历数组

for(NSString *str in array){

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

}
  1. 对数组中的元素进行排序,可以调用NSArray的- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr方法对数组进行排序,参数为一个block,用来指定比较规则。
// 排序

array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

    return obj1<obj2;

}];

NSLog(@"%@",array);

NSMutableArray继承NSArray可以创建一个可变数组,可以实现数组的添加、删除和替换等操作。下面代码实现了可变数组的初始化、添加、删除和替换的功能。

// 初始化

NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:20];

// 添加

[mArray addObject:@"A"];

[mArray addObject:@"B"];

[mArray addObject:@"C"];

for(NSString *str in mArray){

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

}

// 删除

[mArray removeObjectAtIndex:1];

// 删除所有

//[mArray removeAllObjects];

// 删除最后一个

//[mArray removeLastObject];

// 替换

[mArray setObject:@"new object" atIndexedSubscript:1];

[mArray replaceObjectAtIndex:1 withObject:@"new object2"];

NSLog(@"%@",mArray);

13.2 集合NSSet和NSMutableSet

NSSet是一个无序的不可变对象集合,NSMutableSet继承NSSet是一个可变无序集合。和NSArray相比NSSet集合中的元素是无序的并且和唯一的,而NSArray中的元素的有序且可以重复的。使用NSSet常用的操作包括初始化对象、集合的遍历、判断当前集合是否是某个集合的子集、判断当前集合是否是某个集合的交集等。

  1. NSSet的初始化,可以使用一个NSArray初始化,也可以可使用存在的一个NSSet,还可以使用使用一个组对象。
// 使用数组初始化

NSArray *array = @[@"A",@"B",@"C"];

NSSet *set = [NSSet setWithArray:array];

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

// 使用存在的数组初始化

NSSet *set1 = [[NSSet alloc]initWithSet:set];

// 使用一组对象

NSSet *set2 = [NSSet setWithObjects:@"item1",@"item2",@"item3",nil];
  1. 可以使用count方法计数集合中元素的个数,可以使用增强型for循环来遍历集合。
// 个数

NSUInteger count = [set count];

NSLog(@"count=%lu",count);

// 遍历

for(NSString *item in set){

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

}
  1. 可以使用anyObject方法获得集合中任意一个元素,也可以containsObject方法判断当前集合是否包含该某个元素。
// 获得任意一个对象

NSString *anyObj = [set anyObject];

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

// 判断是否包含某个对象

BOOL result = [set containsObject:@"A"];

if (result) {

    NSLog(@"contains");

}else{

    NSLog(@"not contains");

}
  1. 可以使用isSubsetOfSet方法判断两个集合的子集关系,使用intersectsSet方法判断两个集合的交集关系。
// 判断是否是某个集合的子集

NSSet *set11 = [NSSet setWithObjects:@"A",@"B",@"C",@"C", nil];

NSSet *set12 = [NSSet setWithObjects:@"B",@"C", nil];

result = [set12 isSubsetOfSet:set11];

if (result) {

    NSLog(@"set2 is subset of set1");

}else{

    NSLog(@"set2 is not subset of set1");

}

// 判断是否是交集

result = [set12 intersectsSet:set11];

if (result) {

    NSLog(@"set12 is intersects of set11");

}else{

    NSLog(@"set12 is not intersects of set11");

}

NSMuableSet继承NSSet,该集合是可变的,可以实现元素的添加、删除、替换等操作。下面就针对这些方法加以演示。

  1. NSMutableSet的初始化。通常使用+ (id)setWithCapacity:(NSUInteger)numItems方法初始化集合。根据numItems参数分配内存大小。

NSMutableSet *mSet = [NSMutableSet setWithCapacity:5];

  1. 可以向集合中添加元素,也可以删除某个元素,或删除所有元素。
// 添加对象

[mSet addObject:@"A"];

[mSet addObject:@"B"];

[mSet addObject:@"C"];

[mSet addObject:@"C"];

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

// 删除对象

[mSet removeObject:@"B"];

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

// 删除所有元素

 [mSet removeAllObjects];
  1. 可以通过unionSet方法求两个集合的并集,intersectSet求两个集合交集,minusSet第一个集合减去第二个集合。
// 求子、交、并集

NSMutableSet *set1 = [NSMutableSet setWithCapacity:5];

[set1 addObject:@"A"];

[set1 addObject:@"B"];

[set1 addObject:@"C"];

NSMutableSet *set2 = [NSMutableSet setWithCapacity:5];

[set2 addObject:@"B"];

[set2 addObject:@"C"];

[set2 addObject:@"D"];

// 并集

//[set1 unionSet:set2];

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

// 交集

//[set1 intersectSet:set2];

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

// set1 减 set2

[set1 minusSet:set2];

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

13.3 字典NSDictionary和NSMutableDictionary

NSDictionary是一个包含key-value键值对的集合,NSDictionary是一个不可变集合一旦创建不可修改大小。而NSMutableDictionary继承NSDictionary是可变集合,可以对集合中的元素进行添加或删除。

NSDictionary集合的操作包括,初始化、根据key获得value、获得集合大小、获得所有key及所有value和遍历集合等。

  1. 初始化NSDictionary,初始化方法包括直接赋值和+ (id)dictionaryWithObjects:(NSArray )objects forKeys:(NSArray )keys方法。
// 初始化1

NSDictionary *dic1 = @{@"first name": @"guo",@"last name": @"hongzhi",@"age":@"30"};

// 初始化2

NSArray *keys = @[@"k1",@"k2",@"k3"];

NSArray *values = @[@"v1",@"v2",@"v3"];

NSDictionary *dic2 = [NSDictionary dictionaryWithObjects:values forKeys:key
  1. 最常用的方法是根据key获得value,使用- (id)objectForKey:(id)aKey方法。
// 根据key获得value

NSLog(@"First name=%@",dic1[@"first name"]);

NSLog(@"Last name=%@",dic1[@"last name"]);

NSLog(@"Age=%@",dic1[@"age"]);
  1. 可以使用count方法计数集合大小,使用增强型for循环遍历集合。
// 计数

NSUInteger count = [dic2 count];

NSLog(@"count=%lu",count);

// 遍历

for(NSString *key in dic2){

  NSString *value = [dic2 objectForKey:key];

  NSLog(@"%@,%@",key,value);

}
  1. 也可以使用- (NSArray )allKeys方法和- (NSArray )allValues方法获得所有key或所有value。
// 获得所有keys

NSArray *allKeys = [dic2 allKeys];

for(NSString *key in allKeys){

    NSLog(@"%@",key);

}

// 所有values

NSArray *allValues = [dic2 allValues];

for(NSString *value in allValues){

    NSLog(@"%@",value);

}

NSMutableDictionary继承NSDictionary,是可变集合,可以对集合中的元素进行维护,例如,添加、删除等操作。对NSMutableDictionary集合的操作包括初始化、添加、删除和删除所有元素等操作。

  1. 初始化NSMutableDictionary,使用+ (id)dictionaryWithCapacity:(NSUInteger)numItems方法分配指定数量大小的内存。

NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:2];

  1. 添加删除元素,使用- (void)setObject:(id)anObject forKey:(id < NSCopying >)aKey添加元素,使用
- (void)removeObjectForKey:(id)aKey方法删除元素,使用- (void)removeAllObjects方法删除所有元素

    // 初始化

    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:2];

    // 添加

    [dic setObject:@"value1" forKey:@"key1"];

    [dic setObject:@"value2" forKey:@"key2"];

    [dic setObject:@"value3" forKey:@"key3"];

    [dic setObject:@"value4" forKey:@"key4"];

    for(NSString *key in dic){

        NSString *value = [dic objectForKey:key];

        NSLog(@"%@,%@",key,value);

    }

    // 删除

    [dic removeObjectForKey:@"key1"];

    NSLog(@"-------------");

    for(NSString *key in dic){

        NSString *value = [dic objectForKey:key];

        NSLog(@"%@,%@",key,value);

    }

    // 删除所有对象

    [dic removeAllObjects];