NSArray 是不可变数组,一旦创建完成就不能够对数组进行,添加,删除等操作。数组中可以存储不同类型的对象。数组实际上存储的时对象的地址,同样也可以存储数组的地址。以nil作为数组结尾。
1.创建集合
NSArray * array2 = [[NSArray alloc]
initWithObjects:@"one",@"two", nil]; //先创建再初始化
NSArray * array1 = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];//创建并初始化
NSArray * karray = @[@"a",@"b",@"c”];//快捷方式
//8.获得一个数组中的元素
NSString * kstr = karray[0];//快捷方式
NSString * str = [array objectAtIndex:0];//普通方式
//10.获得数组的元素个数
NSUInteger arrayCount = [array count];
判断数组中是否存在某个对象
BOOL isContain = [array containsObject:p1];
----------------------遍历集合-----------------------
//1.使用for循环遍历数组
//2.使用增强for循环的方式遍历数组(集合中元素类型最好一样)
for (NSString * str in array)
{
NSLog(@"str = %@",str);
}
//3.枚举器(迭代器)
NSEnumerator * enumerateor = [array3 objectEnumerator];
NSString * value;
while (value = [enumerateor nextObject]) {
NSLog(@"enum str %@",value);
}
----------------------集合排序-----------------------
未排序前按照你存入元素的顺序
//1.使用sortedArrayUsingSelector
NSArray * array = @[@"b",@"d",@"a",@"z"];
NSLog(@"排序前 array %@",array);
array = [array sortedArrayUsingSelector:@selector(compare:)];//调用元素的compare()
NSLog(@"排序后 array %@",array);
//2.使用block方式排序
NSArray * array2 = @[@"z",@"4",@"b",@"3",@"x"];
NSLog(@"array2 排序前 %@",array2);
array2 = [array2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
/*
NSComparisonResult retuslt = [obj1 compare:obj2];
return retuslt;
*/
//obj1 compare obj2 就是正序排序 (原理没搞懂,好像和retuslt的结果没关系)
return [obj1 compare:obj2];
//obj2 compare obj1 就是倒序排序
return [obj2 compare:obj1];
}];
NSLog(@"array2 排序后 %@",array2);
Person * p1 = [[Person alloc] initWithName:@"xiaozhe" andAge:20 andYear:@"1990"];
Person * p2 = [[Person alloc] initWithName:@"alex" andAge:18 andYear:@"2990"];
Person * p3 = [[Person alloc] initWithName:@"merry" andAge:25 andYear:@"1890"];
NSArray * array3 = @[p1,p2,p3];
NSLog(@"array3 排序前 %@",array3);
//3.使用NSSortDescriptor给数组排序
//如果你向给你自己定义的对象排序,必须根据某一个属性来排序,
//sortDescriptorWithKey 参数要的就是你对象中,要依据哪个属性来排序,你就把哪个属性的名字当成key传入
//ascending YES表示正序 NO表示倒叙
NSSortDescriptor * d1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
NSSortDescriptor * d2 = [NSSortDescriptor sortDescriptorWithKey:@"year" ascending:NO];
//如果你要使用多个属性进行排序,默认在前面的NSSortDescriptor优先级比较高
NSArray * descripts = @[d2,d1];
array3 = [array3 sortedArrayUsingDescriptors:descripts];
NSLog(@"array 3 排序后 %@",array3);
//4.指定属性的block
NSArray * array4 = @[p1,p2,p3];
NSLog(@"array4 排序前 %@",array4);
array4 = [array4 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Person * p1 = obj1;
Person * p2 = obj2;
//按照year排序
NSComparisonResult retuslt = [p1.year compare:p2.year];
return retuslt;
}];
NSLog(@"array4 排序后 %@",array4);
NSMutableArray 继承至 NSArray
//1.创建可变数组
NSMutableArray * array = [[NSMutableArray alloc] initWithCapacity:0];
//使用addObject 动态给数组中增加元素,(插入到末尾)
/*
[array addObject:@"one"];
[array addObject:@"two"];
[array addObject:@"three"];
[array addObject:@"one"];
*/
NSString * str1 = @"one";
NSString * str2 = @"two";
NSString * str3 = @"three";
//数组中可以存储,同一个对象多次
[array addObject:str1];
[array addObject:str2];
[array addObject:str3];
[array addObject:str1];
//2.指定对象插入的位置
[array insertObject:str1 atIndex:2];
//3.删除 会通过对象,删除数组中所有的同一个地址的对象
[array removeObject:str1];
//4.通过索引的方式删除对象,超出了数组的count值,那么就会导致异常 index beyond bounds
[array removeObjectAtIndex:0];
[array addObject:str2];
[array addObject:str3];
[array addObject:str1];
//5.删除数组中所有的元素
[array removeAllObjects];
NSLog(@"array %@",array);
[array addObject:str2];
[array addObject:str3];
[array addObject:str1];
----------------------遍历集合-----------------------
//1.for换遍历
for (int i = 0; i < array.count; i++)
{
NSString * str = [array objectAtIndex:i];
//在遍历数组的时候,千万不要给数组中,增加,或者删除元素
// [array removeObject:str1];
NSLog(@"str %@",str);
}
//2.增强for循环
for (NSString * str in array)
{
// [array removeObject:str1];
//如果你在增强for循环中,删除元素,会直接导致异常出现
NSLog(@"str %@",str);
}
//3.枚举器
NSEnumerator * enumerator = [array objectEnumerator];
NSString * value;
while (value = [enumerator nextObject]) {
//如果你在枚举器中,删除元素,会直接导致异常出现
// [array removeObject:str1];
NSLog(@"str %@",value);
}
//4.要通过遍历的方式确定删除哪个元素怎么办
NSMutableArray * array2 = [[NSMutableArray alloc] init];
[array2 addObject:@"1"];
[array2 addObject:@"2"];
[array2 addObject:@"3"];
[array2 addObject:@"4"];
[array2 addObject:@"5"];
NSMutableArray * tmp = [[NSMutableArray alloc] init]; //用临时数组来记录要删除的元素
for (NSString * str in array2)
{
if ([str isEqualToString:@"3"])
{
[tmp addObject:str];
}
}
NSLog(@"array2 %@",array2);
NSLog(@"tmp %@",tmp);
//遍历的是临时数组,删除的是array2
for (int i = 0; i < tmp.count; i++)
{
NSString * str = [tmp objectAtIndex:i];
//从原数组中删除,临时数组中存储的对象
[array2 removeObject:str];
}
NSLog(@"array2 %@",array2);
NSDictionary
//1.创建字段,不可变的
NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:@"xiaozhe",@"name", nil];
NSLog(@"dic %@",dic);
//2.快捷创建方式
NSDictionary * dic2 = @{ @"one":@"1",@"two":@"2"};
NSLog(@"dic2 %@",dic2);
//3.字典中可以存任意数据类型
// 字典的顺序不是自然顺序
NSArray * array = @[@"one",@"two"];
NSDictionary * dic3 = @{
@"one":@"1",
@"num":[NSNumber numberWithInt:10],
@"aaa":dic2,
@"bbb":dic,
@"ar1":array
};
NSLog(@"dic3 %@",dic3);
//4.获得字典的长度
NSLog(@"count %ld",dic3.count);
//5.从字典中取值
NSString * str = [dic3 objectForKey:@"one"];
NSLog(@"str %@",str);
NSDictionary * dicTmp = [dic3 objectForKey:@"aaa"];
NSLog(@"dicTmp %@",dicTmp);
NSArray * arrayTmp = [dic3 objectForKey:@"ar1"];
NSLog(@"arrayTmp %@",arrayTmp);
//6.遍历
//取出所有的key值
NSArray * allkeys = [dic3 allKeys];
NSLog(@"allkeys %@",allkeys);
for (int i = 0; i < allkeys.count; i++)
{
NSString * key = [allkeys objectAtIndex:i];
//如果你的字典中存储的多种不同的类型,那么最好用id类型去接受它
id obj = [dic3 objectForKey:key];
NSLog(@"obj %@",obj);
}
//2.枚举器
NSEnumerator * enumerator = [dic3 objectEnumerator];
id value;
while (value = [enumerator nextObject]) {
NSLog(@"value %@",value);
}
//1.创建一个可变长度字典
NSMutableDictionary * muDic = [[NSMutableDictionary alloc] initWithCapacity:0];
//2.向字典中村如数据
[muDic setObject:@"1" forKey:@"one"];
[muDic setObject:@"2" forKey:@"two"];
[muDic setObject:@"3" forKey:@"three"];
NSLog(@"muDic %@",muDic);
//3.删除
[muDic removeObjectForKey:@"one"];
NSLog(@"muDic %@",muDic);
//4.全部删除
[muDic removeAllObjects];
NSLog(@"muDic %@",muDic);
Student * stu1 = [[Student alloc] initWithName:@"xiaoher" andAge:20];
Student * stu2 = [[Student alloc] initWithName:@"alex" andAge:50];
Student * stu3 = [[Student alloc] initWithName:@"xiaoli" andAge:10];
[muDic setObject:stu1 forKey:@"s1"];
[muDic setObject:stu2 forKey:@"s2"];
[muDic setObject:stu3 forKey:@"s3"];
//在向字典中存储数据的时候,一定要保证key值是唯一的
// [muDic setObject:stu3 forKey:@"s3"];
// [muDic setObject:stu3 forKey:@"s3"];
// [muDic setObject:stu3 forKey:@"s3"];
//1.使用for循环遍历字典
NSArray * allkeys = [muDic allKeys];
for (int i = 0; i < allkeys.count; i++)
{
NSString * key = [allkeys objectAtIndex:i];
Student * stu = [muDic objectForKey:key];
NSLog(@"stu %@",stu);
};
//2.使用枚举器
NSEnumerator * enumerator = [muDic objectEnumerator];
Student * tmp;
while (tmp = [enumerator nextObject]) {
NSLog(@"tmp %@",tmp);
}
NSset set集合
NSArray 自然顺序,NSSet是无序的。NSSet中不能够存储重复的数据,可以用它来去除重复的值
NSString * str1 = @"one";
NSString * str2 = @"two";
NSString * str3 = @"three";
NSSet * set = [[NSSet alloc] initWithObjects:str1,str2,str3,str1, nil];
//count
NSLog(@"count %ld",set.count);
//是否包含
BOOL isContains = [set containsObject:str1];
//4.遍历
NSEnumerator * enumerator = [set objectEnumerator];
NSString * value;
while (value = [enumerator nextObject]) {
NSLog(@"value %@",value);
}
NSMutableSet 可变set集合
//1 创建一个可变集合
NSMutableSet * muSet = [[NSMutableSet alloc] init];
//2.增加值
[muSet addObject:str1];
[muSet addObject:str2];
//3.删除
[muSet removeObject:str1];
NSLog(@"muSet %@",muSet);
//4.删除所有
// [muSet removeAllObjects];
NSLog(@"muSet %@",muSet);
//5.遍历
NSEnumerator * en = [muSet objectEnumerator];
NSString * value;
while (value = [en nextObject]) {
NSLog(@"value %@",value);
}