今天学习了OC中数组Array和NSMutableArray可变数组,并且结合实例练习了有关的数组操作方法
几个注意点:
//NSArray中不可以存放基本数据类型,只能存放类的实例,如果需要将基本类型、结构体放入到数组中得话,需要通过NSNumber/NSValue进行数据的封装
//不能在NSArray中存储nil ,nil是作为结束的标志
直接上例子:
//以为需要实现数组储存类对象,因此写了一个学生类
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property(strong,nonatomic) NSString * name;
@property(assign,nonatomic) int age;
- (NSComparisonResult)compareStudentDesc:(Student *)other;
-(NSComparisonResult)compareStudentAgeDesc:(Student *)other;
@end
//
#import "Student.h"
@implementation Student
- (NSString *)description
{
return [NSString stringWithFormat:@"%@,%d", self.name,self.age];
}
/**
* 安装姓名降序排列
*
* @param other 集合中得元素
*
* @return -1,0,+1
*/
- (NSComparisonResult)compareStudentDesc:(Student *)other
{
return [other.name compare:self.name];
}
-(NSComparisonResult)compareStudentAgeDesc:(Student *)other
{
if (other.age>self.age) {
return -1;
}else if (other.age==self.age){
return 0;
}else{
return 1;
}
}
@end
//
// main.m
// OC16-8.5-NSArray
//
// Created by 严诚 on 15/8/5.
// Copyright (c) 2015年 严诚. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
// NSLog(@"Hello, World!");
// NSString *str =@"abc def hij";
//创建数组
// NSArray *arr=[str componentsSeparatedByString:@" "];//字符串按空格分隔成数组元素
// NSLog(@"%@",arr);
// NSString *str1=[arr componentsJoinedByString:@" "];//数组元素加上空格组合为字符串
// NSLog(@"%@",str1);
// NSArray *arr=[NSArray array];
// NSArray *arr1=[NSArray arrayWithObject:@"yc"];//初始化数组加入对象
// NSString *name =[arr1 objectAtIndex:0];//按照下标获取元素
// NSLog(@"%@",name);
// NSArray *arr2=[NSArray arrayWithObjects:@"yc",@"dq", nil];
// NSLog(@"%ld",arr2.count);
// for (int i=0; i<
// arr2.count; i++) {
// NSString *name1=[arr2 objectAtIndex:i];
// NSLog(@"%@",name1);
// }
// Student *stu=[Student new];
// stu.name=@"yc";
// stu.age=18;
// Student *stu1=[Student new];
// stu1.name=@"dq";
// stu1.age=19;
// Student *stu2=[Student new];
// stu2.name=@"wyy";
// stu2.age=19;
// NSArray *students=[NSArray arrayWithObjects:stu,stu1,stu2, nil];
// NSLog(@"%@",students);//调用descration方法
//遍历数组
// for (int i=0; i<students.count; i++) {
// NSLog(@"%@",[students[i] name]);
// Student *temp=students[i];
// NSLog(@"-%@",temp.name);
// }
// //快速枚举
// for(Student *stu in students){
// NSLog(@"%d",stu.age);
// }
//
//
NSArray *arr3=[NSArray arrayWithObjects:@"aaa",@"b0",@"fff",@"ca", nil];
//NSArray *arr4=[NSArray arrayWithArray:arr3];
//取第一个和最后一个元素
NSLog(@"first is %@",arr3.firstObject);
NSLog(@"last is %@",arr3.lastObject);
//查找元素、获取等值元素的下标
long int index=[arr3 indexOfObject:@"aaa"];
NSLog(@"%ld",index);
//迭代遍历
NSEnumerator *e=[arr3 objectEnumerator];
id object;
while (object=[e nextObject]) {
NSLog(@"-%@",object);
}
for(id aobj in e){
NSLog(@"--%@",aobj);
}
//
// NSEnumerator *e=[arr3 reverseObjectEnumerator];
// id object;
// while (object=[e nextObject]) {
// NSLog(@"-%@",object);
// }
// 数组比较
// BOOL bol =[arr3 isEqualToArray:arr4];
// NSLog(@"%d",bol);
// 数组追加
// NSLog(@"%@",[arr3 arrayByAddingObject:@"ddd"]);
// 数组排序(选择器法)
// NSLog(@"%@",[arr3 sortedArrayUsingSelector:@selector(compare:)]);
// NSArray *sortarr=[arr3 sortedArrayUsingSelector:@selector(compare:)];
// for(NSString *str in sortarr){
// NSLog(@"%@",str);
// }
//
Student *stu=[Student new];
stu.name=@"yc";
stu.age=18;
Student *stu1=[Student new];
stu1.name=@"dq";
stu1.age=19;
Student *stu2=[Student new];
stu2.name=@"wyy";
stu2.age=17;
NSArray *students=[NSArray arrayWithObjects:stu,stu1,stu2, nil];
//NSLog(@"%@",students);//调用descration方法
for(Student *stu3 in students){
NSLog(@"%@",stu3);
}
// //自写选择器进行排序
// NSArray *newStudent=[students sortedArrayUsingSelector:@selector(compareStudentDesc:)];
// for(Student *stu4 in newStudent){
// NSLog(@"%@",stu4);
// }
// NSArray *newStu=[students sortedArrayUsingSelector:@selector(compareStudentAgeDesc:)];
// for(Student *stu5 in newStu){
// NSLog(@"%@",stu5);
// }
//
// //描述信息排序
// //按照name属性进行降序排序
// NSSortDescriptor *sd=[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:1];
// //将信息封装到集合中
// NSArray *sortstu2=[NSArray arrayWithObject:sd];
// //调用集合的描述信息排序方法
// NSArray *newStu2=[newStu sortedArrayUsingDescriptors:sortstu2];
// for(Student *stu6 in newStu2){
// NSLog(@"%@",stu6);
// }
//代码块排序
NSArray *newstu=[students sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){
Student *stuA=(Student *)obj1;
Student *stuB=(Student *)obj2;
return [stuA.name compare:stuB.name];
}];
for(Student *stu6 in newstu){
NSLog(@"%@",stu6);
}
}
return 0;
}
下面是关于可变数组的一些实例,其更加灵活易用
//
// main.m
// OC16-8.5-NSMutableArray
//
// Created by 严诚 on 15/8/5.
// Copyright (c) 2015年 严诚. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
NSMutableArray *muArr=[NSMutableArray arrayWithCapacity:0];//初始化可变数组
NSLog(@"%ld",muArr.count);//数组长度
[muArr addObject:@"aaaa"];//添加元素
[muArr addObject:@"bbbbb"];
[muArr addObject:@"bbbbb"];
[muArr addObject:@"ffbb"];
[muArr addObject:@"ddd"];
[muArr insertObject:@"ccc" atIndex:1];//按照下标插入元素
NSLog(@"%ld",muArr.count);
for (int i=0; i<muArr.count; i++) {
NSLog(@"%@",[muArr objectAtIndex:i]);//按照下标循环遍历
}
//[muArr removeAllObjects];//移除所有元素
//[muArr removeObject:@"ccc"];//移除某值元素
//[[muArr removeObjectAtIndex:1];//移除某下标元素
NSRange r1={1,2};//NSRange 声明一个范围值(位置,长度)
[muArr removeObjectsInRange:r1];//在一定范围内删除
[muArr removeObjectIdenticalTo:@"aaaa" inRange:r1];//在一定范围内删除某值
NSArray *arr=[NSArray arrayWithObject:@"abcdf"];
[muArr addObjectsFromArray:arr];//从数组添加元素
for (int i=0; i<muArr.count; i++) {
NSLog(@"%@",[muArr objectAtIndex:i]);
}
[muArr exchangeObjectAtIndex:0 withObjectAtIndex:1];//交换数组元素
for (int i=0; i<muArr.count; i++) {
NSLog(@"%@",[muArr objectAtIndex:i]);
}
//[muArr replaceObjectsInRange:r1 withObjectsFromArray:arr];
//动态数组排序
//1.选择器
[muArr sortUsingSelector:@selector(compare:)];
NSLog(@"%@",muArr);
//2.排序信息
NSSortDescriptor *sd=[NSSortDescriptor sortDescriptorWithKey:nil ascending:1];
[muArr sortUsingDescriptors:@[sd]];//@[]表示集合
//3.代码块
[muArr sortUsingComparator:^NSComparisonResult(NSString * obj1,NSString *obj2){
return [obj1 compare:obj2];
}];
}
return 0;
}
相比上面吧的实例都比较简单易懂,接下来是今天的练习:
/**
* 作业:通过所学知识对西游记师徒进行情景编码,按照收徒的先后顺序依次加入取经团队,可以通过姓名,年龄,本领进行排序。实现如下方法,猪悟能可以离开团队回高老庄。唐僧因误会可以赶走孙悟空等等。
*/
/*题目不难,就是使用今日所学方法,先定义了取经人类,定义了属性和公共方法,又写了徒弟类实现直接离开队伍,写了shifu类,实现踢出元素*/
#import <Foundation/Foundation.h>
@interface Qujinger : NSObject
@property(strong,nonatomic)NSString *name;
@property(assign,nonatomic)int age;
@property(strong,nonatomic)NSString *ability;
-(NSComparisonResult)compareByName:(Qujinger *)other;
-(NSComparisonResult)compareByAge:(Qujinger *)other;
@end
#import "Qujinger.h"
@implementation Qujinger
- (NSString *)description
{
return [NSString stringWithFormat:@"我是%@,我%d岁,我的本领是%@!", self.name,self.age,self.ability];
}
-(NSComparisonResult)compareByName:(Qujinger *)other
{
return [other.name compare:self.name];
}
-(NSComparisonResult)compareByAge:(Qujinger *)other
{
if (other.age>self.age) {
return -1;
}else if (other.age==self.age){
return 0;
}else{
return 1;
}
}
@end
#import <Foundation/Foundation.h>
#import "Qujinger.h"
@interface Tudi : Qujinger
-(void)goBymyselfFrom:(NSMutableArray *)muarr;
@end
#import "Tudi.h"
@implementation Tudi
-(void )goBymyselfFrom:(NSMutableArray *)muarr
{
[muarr removeObject:self];
NSLog(@"%@走了!",self.name);
}
@end
#import <Foundation/Foundation.h>
#import "Qujinger.h"
#import "Tudi.h"
@interface Shifu : Qujinger
-(void)leaveMe:(Tudi *)tudi From:(NSMutableArray *)muarr;
@end
#import "Shifu.h"
@implementation Shifu
-(void)leaveMe:(Tudi *)tudi From:(NSMutableArray *)muarr
{
[muarr removeObject:tudi];
NSLog(@"%@你走吧,我不需要你了",tudi.name);
}
@end
#import <Foundation/Foundation.h>
#import "Shifu.h"
#import "Tudi.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableArray *qujing=[NSMutableArray arrayWithCapacity:0];
Shifu *Tang=[Shifu new];
[Tang setName:@"tangsen"];
[Tang setAge:26];
[Tang setAbility:@"赶猴子走"];
[qujing addObject:Tang];
Tudi *Sun=[Tudi new];
[Sun setName:@"sunwukong"];
[Sun setAge:1500];
[Sun setAbility:@"打"];
[qujing addObject:Sun];
Tudi *Zhu=[Tudi new];
[Zhu setName:@"zhuwuneng"];
[Zhu setAge:1900];
[Zhu setAbility:@"吃"];
[qujing addObject:Zhu];
Tudi *Sha=[Tudi new];
[Sha setName:@"shawujing"];
[Sha setAge:1800];
[Sha setAbility:@"躲"];
[qujing addObject:Sha];
Qujinger *qu;
for(qu in qujing)
{
NSLog(@"%@",qu);
}
NSLog(@"----现在来按名字排序吧----");
NSLog(@"先用选择器排序");
[qujing sortUsingSelector:@selector(compareByName:)];
for(qu in qujing)
{
NSLog(@"%@",qu);
}
NSLog(@"再用描述排序");
NSSortDescriptor *ds1=[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:1];
[qujing sortUsingDescriptors:@[ds1]];
for(qu in qujing)
{
NSLog(@"%@",qu);
}
NSLog(@"最后用代码段排序");
[qujing sortUsingComparator:^NSComparisonResult(Qujinger *obj1,Qujinger *obj2)
{
return [obj1.name compare:obj2.name];
}];
for(qu in qujing)
{
NSLog(@"%@",qu);
}
NSLog(@"--------现在来按年龄排序吧--------");
NSLog(@"先用选择器排序");
[qujing sortUsingSelector:@selector(compareByAge:)];
for(qu in qujing)
{
NSLog(@"%@",qu);
}
NSLog(@"再用描述排序");
NSSortDescriptor *ds2=[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:1];
[qujing sortUsingDescriptors:@[ds2]];
for(qu in qujing)
{
NSLog(@"%@",qu);
}
NSLog(@"最后用代码段排序吧");
[qujing sortUsingComparator:^NSComparisonResult(Qujinger *obj1,Qujinger *obj2)
{
if (obj1.age>obj2.age) {
return -1;
}else if (obj1.age==obj2.age){
return 0;
}else{
return 1;
}
}];
for(qu in qujing)
{
NSLog(@"%@",qu);
}
NSLog(@"----每个徒弟都可以选择自己离开队伍----");
[Zhu goBymyselfFrom:qujing];
for(qu in qujing)
{
NSLog(@"%@",qu);
}
NSLog(@"--------师傅可以赶走任一个徒弟--------");
[Tang leaveMe:Sun From:qujing];
for(qu in qujing)
{
NSLog(@"%@",qu);
}
}
return 0;
}
-
-
-15.8.5
-15.8.11