Object-c学习之路八(NSArray(数组)遍历和排序)

2024-02-25 02:38

本文主要是介绍Object-c学习之路八(NSArray(数组)遍历和排序),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天学习了NSArray的遍历和排序,现在在这里做一下总结:

遍历现在实现了四中方法:

排序大概有三中方法:(代码中都有注释)

关于对象的排序还是以Student和Book为例 每个Student持有一个Book.


主函数:

//
//  main.m
//  NSArray
//
//  Created by WildCat on 13-7-25.
//  Copyright (c) 2013年 wildcat. All rights reserved.
//#import <Foundation/Foundation.h>
#import "Student.h"
#pragma mark 创建一个集合
void arrayTest(){//创建一个数组NSArray *array=[NSArray array];array=[NSArray arrayWithObjects:@"123",@"sf",@"dsg", nil];NSLog(@"array is:%@",array);NSLog(@"tength is: %zi",array.count);
}#pragma mark 给数组里的元素发送消息
void arrayMessage(){Student *stu1=[Student student];Student *stu2=[Student student];Student *stu3=[Student student];NSArray *array=[NSArray  arrayWithObjects:stu1,stu2,stu3, nil];//让数组里的元素调用addMessage方法[array makeObjectsPerformSelector:@selector(addMessage:) withObject:@"你好。"];}#pragma mark 数组遍历(四种方法)void arrayLoop(){Student *stu1=[Student student];NSArray *array=[NSArray arrayWithObjects:stu1,@"1",@"2",@"3", nil];//方法一   for循环for (int i=0; i<array.count; i++) {NSLog(@"%i->%@",i,[array objectAtIndex:i]);}//方法二int i=0;for (id obj in array) {NSLog(@"%i->%@",i,obj);i++;}//方法三   通过Block遍历:官方建议使用block[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {NSLog(@"%zi->%@",idx,obj);//当执行到第3个时停止if (idx==2){*stop=YES;}}];//方法四 通过迭代器遍历//获得一个迭代器NSEnumerator *enumerator=[array objectEnumerator];id next=nil;while (next=[enumerator nextObject]) {NSLog(@"next->%@",next);}//反向遍历NSEnumerator *rvenumerator=[array reverseObjectEnumerator];id rvnext=nil;while (rvnext=[rvenumerator nextObject]) {NSLog(@"rvnext->%@",rvnext);}}#pragma mark 数组排序
void arraySort(){NSArray *array=[NSArray arrayWithObjects:@"4",@"1",@"2",@"3", nil];//排完后产生一个新的数组//指定元素的排序方法 compare:NSArray *array2=[array sortedArrayUsingSelector:@selector(compare:)];NSLog(@"排序后:%@",array2);
}
#pragma mark 对数组中的Student对象进行排序:
//先按照性进行排序,后按照名进行排序(两种方法)
void studentSort(){Student *stu1=[Student initWithFirstName:@"lianjie" LastName:@"Li"];Student *stu2=[Student initWithFirstName:@"dehua" LastName:@"Liu"];Student *stu3=[Student initWithFirstName:@"xingle" LastName:@"Li"];Student *stu4=[Student initWithFirstName:@"long" LastName:@"Cheng"];NSArray *array=[NSArray arrayWithObjects:stu1,stu2,stu3,stu4, nil];//第一种方法NSArray *array2=[array sortedArrayUsingSelector:@selector(compareStudent:)];NSLog(@"排序后:%@",array2);//第二种方法  通过Block排序NSArray *array3=[array sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {//先按照性进行排序NSComparisonResult result=[obj1.lastname compare:obj2.lastname];//再按照名进行排序if (result==NSOrderedSame) {result=[obj1.firstname compare:obj2.firstname];}return result;}];NSLog(@"通过Block排序后:%@",array3);}#pragma mark 对数组中的Student对象进行排序://对数组中的Student对象进行排序:先按照性进行排序,后按照名进行排序(另一种方法)
void studentSort2(){Student *stu1=[Student initWithFirstName:@"lianjie" LastName:@"Li" bookName:@"book1"];Student *stu2=[Student initWithFirstName:@"dehua" LastName:@"Liu" bookName:@"book2"];Student *stu3=[Student initWithFirstName:@"xingle" LastName:@"Li" bookName:@"book2"];Student *stu4=[Student initWithFirstName:@"long" LastName:@"Cheng" bookName:@"book1"];NSArray *array=[NSArray arrayWithObjects:stu1,stu2,stu3,stu4, nil];//先按照书名进行排序NSSortDescriptor *bookNameDesc=[NSSortDescriptor sortDescriptorWithKey:@"book.name" ascending:YES];NSSortDescriptor *lastnameDesc=[NSSortDescriptor sortDescriptorWithKey:@"lastname" ascending:YES];NSSortDescriptor *firstnameDesc=[NSSortDescriptor sortDescriptorWithKey:@"firstname" ascending:YES];NSArray *decarray=[NSArray arrayWithObjects:bookNameDesc,lastnameDesc,firstnameDesc, nil];NSArray *array2=[array sortedArrayUsingDescriptors:decarray];NSLog(@"排序后:%@",array2);}int main(int argc, const char * argv[])
{@autoreleasepool {// arrayTest();// arrayMessage();//arrayLoop();// arraySort();// studentSort();//先根据book名,后根据性 ,再根据名 进行排序studentSort2();}return 0;
}

Student函数:

头文件:

//  Student.h
//  NSArray
//
//  Created by WildCat on 13-7-25.
//  Copyright (c) 2013年 wildcat. All rights reserved.
//#import <Foundation/Foundation.h>
@class Book;
@interface Student : NSObject{NSString *_firstname;NSString *_lastname;}
@property  (nonatomic,retain) NSString * firstname;
@property (nonatomic,retain) NSString * lastname;
//每个学生拥有一本书
@property (nonatomic,retain)Book *book;
+(id)initWithFirstName:(NSString *)firstname LastName:(NSString *)lastname;
+(id)initWithFirstName:(NSString *)firstname LastName:(NSString *)lastname bookName:(NSString *)bookName;
+(id)student;
-(void) addMessage:(NSString *)str;
-(NSComparisonResult)compareStudent:(Student *)stu;
@end
.m文件:
//
//  Student.m
//  NSArray
//
//  Created by WildCat on 13-7-25.
//  Copyright (c) 2013年 wildcat. All rights reserved.
//#import "Student.h"
#import "Book.h"
@implementation Student
@synthesize firstname=_firstname;
@synthesize lastname=_lastname;
+(id)initWithFirstName:(NSString *)firstname LastName:(NSString *)lastname{Student *stu=[[[Student alloc] init] autorelease];stu.firstname=firstname;stu.lastname=lastname;return stu;
}
+(id)initWithFirstName:(NSString *)firstname LastName:(NSString *)lastname bookName:(NSString *)bookName{Student *stu=[Student initWithFirstName:firstname LastName:lastname];Book *book=[Book initBookWithName:bookName];stu.book=book;return stu;
}+(id)student{return [[[Student alloc] init] autorelease];}
-(void) addMessage:(NSString *)str{NSLog(@"%@->addMessage->%@",self,str);
}
-(void)dealloc{[_lastname release];[_firstname release];NSLog(@"%@ 被销毁",self);[super dealloc];
}
//定义一个排序方法
-(NSComparisonResult)compareStudent:(Student *)stu{//先按照性进行排序NSComparisonResult result=[self.lastname compare:stu.lastname];//再按照名进行排序if (result==NSOrderedSame) {result=[self.firstname compare:stu.firstname];}return result;
}
//重定义description 方法
-(NSString *)description{return [NSString stringWithFormat:@"%@ %@->%@",self.lastname,self.firstname,self.book.name];}@end


Book类:

.h文件:

//  Book.h
//  NSArray
//
//  Created by WildCat on 13-7-25.
//  Copyright (c) 2013年 wildcat. All rights reserved.
//#import <Foundation/Foundation.h>@interface Book : NSObject
@property (nonatomic ,retain) NSString *name;
+(id)initBookWithName:(NSString *)name;@end
.m文件:
#import "Book.h"@implementation Book+(id)initBookWithName:(NSString *)name{Book *book=[[[Book alloc] init] autorelease];book.name=name;return book;}
-(void)dealloc{[_name release];[super dealloc];}
@end





这篇关于Object-c学习之路八(NSArray(数组)遍历和排序)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744170

相关文章

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(