您的位置:首页 > 其它

集合遍历和数组排序

2017-08-25 14:13 260 查看
一、集合遍历

  集合:OC中提供的容器类,数组,字典,集合。

  遍历:对集合中元素一次取出的过程叫做遍历。

  三种方式:

  1. for循环遍历

  2. NSEnumerator遍历

  3. for…in遍历

二、for循环遍历

  数组遍历:通过for循环的循环变量用作数组元素下标来获取不同下标的元素。循环次数就是数组元素的个数。

 示例:

NSArray *arr = @[@"aaa", @"bbb", @"ccc", @"ddd", @"eee"];
for (NSUInteger i = 0; i < arr.count; i++)
{
NSLog(@"%@", arr[i]);
}


  字典遍历:先获取字典中所有的key,存储到数组中,遍历数组依次取出每一个key,然后根据key从字典中取出对应的value。循环次数等于字典的元素个数。

  示例:

NSDictionary *dic = @{@"name":@"盖伦", @"age":@"123", @"gender":@"w"};
NSArray *keysArr = [dic allKeys];
for (NSUInteger i = 0; i < keysArr.count; i++)
{
NSString *key = keysArr[i];
NSLog(@"%@", dic[key]);
}


  集合遍历:用集合的allObjects属性先取到集合的所有元素存储到数组中,再通过for循环的循环变量用作下标来取到每个元素。

  示例:

NSSet *set = [NSSet setWithObjects:@"element1",@"element2", @"element3", @"element4", nil];
NSArray *objects = set.allObjects;
for (NSUInteger i = 0; i < objects.count; i++)
{
NSString *value = [objects objectAtIndex:i];
NSLog(@"value:%@", value);
}


三、NSEnumerator

  NSEnumerator:枚举器,遍历集合中的元素。其没有创建对象的接口,要想生成其对象,必须依赖于集合类(数组,字典,集合)。枚举器的nextObject方法,可以取到其依附的集合对象中的每一个对象,如果取完返回nil,枚举器对象经常与while循环一起使用。

  注意:在使用枚举器进行遍历时,不可以对正在遍历的可变集合对象进行删除,添加操作。

  数组枚举:

//正序枚举
NSArray *arr = @[@"1", @"2", @"3", @"4"];
NSEnumerator *enumerator = [arr objectEnumerator];
id value = nil;
while (value = [enumerator nextObject])
{
NSLog(@"%@", value);
}
//反序遍历
NSArray *arr = @[@"1", @"2", @"3", @"4"];
//创建枚举器对象(反序)
NSEnumerator *reverse = [arr reverseObjectEnumerator];
id value = nil;
while (value = [reverse nextObject])
{
NSLog(@"%@", value);
}


  字典枚举遍历:

//字典是无序的,所有没有反序遍历
//对字典进行枚举器遍历得到的值就是value
NSDictionary *dictionary = @{@"key1":@"value1", @"key2":@"value2", @"key3":@"value3", @"key4":@"value4"};
NSEnumerator *enumerator = [dictionary objectEnumerator];
d value = nil;
while (value = [enumerator nextObject])
{
NSLog(@"%@", value);
}


  集合枚举遍历:

//字典是无序的,所有没有反序遍历
NSSet *set = [NSSet setWithObjects:@"aa", @"bb", @"cc", @"dd", nil];
NSEnumerator *enumerator = [set objectEnumerator];
id value = nil;
while (value = [enumerator nextObject])
{
NSLog(@"%@", value);
}


四、for…in

  for…in:快速枚举,是在NSEnumerator的基础上封装的更加方便的快速的遍历集合元素的方式。

  格式:

for (集合中对象的类型 *元素名 in 被遍历的集合)
{
语句;
}


  数组的快速枚举:

NSMutableArray *arr = [@[@"1", @"2", @"3", @"4"] mutableCopy];
for (id value in arr)
{
if ([value isEqualToString:@"4"])
{
[arr removeObject:value];
}
NSLog(@"%@", arr);
}


  字典的快速枚举:

//对字典的快速枚举得到的是字典中的key值!
NSDictionary *dic = @{@"name":@"lihua", @"age":@20, @"gender":@"man"};
for (id key in dic)
{
NSLog(@"%@", dic[key]);
}


  集合的快速遍历:

//得到的是集合中的每个元素
NSSet *set = [NSSet setWithObjects:@"1", @"2", @"3", @"4",@"5", nil];
for (NSString *str in set)
{
NSLog(@"%@", str);
}


五、数组排序

  数组是有序容器,因此集合中只有数组才能排序。

  NSSortDescriptor:该类能够方便的实现对数组中的对象进行升序或者降序的排序。它可以把元素的某个属性作为key进行升序或降序的排序,每个NSSortDescriptor对象就是一个排序条件。

  示例:

//1.按姓名排序
NSSortDescriptor *sortName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
//2.按年龄排序
NSSortDescriptor *sortAge = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
//ascending:排序标志,YES-升序,NO-降序.
//数组排序:如果该参数中存储了由name和age两个属性参与创建的NSSortDescriptor对象,在按name进行排序的同时,如果遇到姓名相同的就会按照age进行排序.
NSArray *newArr = [arr sortedArrayUsingDescriptors:@[sortName,sortAge]];
NSLog(@"%@", newArr);


  其他数组排序方法:

//不可变数组排序方法(排序结果生成新数组,原数组无改变)
NSArray *arr = @[@"aaa", @"yyy", @"ccc", @"rrr"];
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", newArr);

//可变数组排序方法(直接对原数组操作,无新数组生成)
NSMutableArray *mArr = [@[@"aaa", @"yyy", @"ccc", @"rrr"]mutableCopy];
[mArr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", mArr);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: