OC中的数组

数组对象

OC的数组里面存放的一定都是对象
数组也分为两种:可变数组与不可变数组

不可变数组

创建不可变数组

1.用便利构造器的方式创建一个空数组

 NSArray *arr = [NSArray array];

2.字面量方法创建

NSArray *arr = @[@"1",@"2",@"3",@"4",@"5"];

用count可以统计出数组里的元素个数
取值也是通过下标来取,返回的是一个对象
如:

NSArray *arr = @[@"1",@"2",@"3",@"4",@"5"];
// 元素个数
NSLog(@"%ld",arr.count);
// 下标为3所对应的值
NSLog(@"%@",[arr objectAtIndex:3]);
// 数组里第三个所对应的内容(从0开始)
NSLog(@"%@",arr[2]);

打印结果:

2015-07-21 17:34:04.260 OC05_数组[2637:160877] 5
2015-07-21 17:34:04.261 OC05_数组[2637:160877] 4
2015-07-21 17:34:04.261 OC05_数组[2637:160877] 3
遍历数组
用for进行遍历
NSArray *arr = @[@"1",@"2",@"3",@"4",@"5"];
for (NSInteger i = 0; i < arr.count ; i++) {
     NSLog(@"%@",arr[i]);
}

打印结果:

2015-07-21 17:38:43.512 OC05_数组[2668:163528] 1
2015-07-21 17:38:43.513 OC05_数组[2668:163528] 2
2015-07-21 17:38:43.513 OC05_数组[2668:163528] 3
2015-07-21 17:38:43.513 OC05_数组[2668:163528] 4
2015-07-21 17:38:43.513 OC05_数组[2668:163528] 5

如果想要判断数组里是否含有字符串可以用containsObject

NSArray *arr = @[@"1",@"2",@"3",@"4",@"5"];
NSLog(@"%d",[arr containsObject:@"5"]);

打印结果:

2015-07-21 17:40:33.193 OC05_数组[2681:164358] 1

遍历嵌套数组
先定义学生类,初始化方法,在此就不再写了

Student *stu1 = [[Student alloc] initWithName:@"asd"];
Student *stu2 = [[Student alloc] initWithName:@"qwe"];
Student *stu3 = [[Student alloc] initWithName:@"zxc"];
Student *stu4 = [[Student alloc] initWithName:@"yui"];
NSArray *arr = [NSArray arrayWithObjects:stu1,stu2,stu3,stu4, nil];
for (int i = 0; i < [arr count]; i++) {
        Student *point = arr[i];
        NSLog(@"%@",point.name);
    }

打印结果:

2015-07-21 18:04:21.550 OC05_数组[2854:172969] asd
2015-07-21 18:04:21.551 OC05_数组[2854:172969] qwe
2015-07-21 18:04:21.551 OC05_数组[2854:172969] zxc
2015-07-21 18:04:21.551 OC05_数组[2854:172969] yui

注意:遍历数组应该定义一个指针,打印用点语法打印

快速枚举

快速枚举:能快速的遍历数组等容器对象且都是对容器里的每一个元素的遍历

为了增加代码的阅读性,避免不必要的错误,尽量让forin的前部分的类型和数组里的元素类型相同

NSArray *arr1 = @[@"a",@"b",@"c",@"d",@"e"];
NSArray *arr2 = @[@"f",@"g",@"h",@"i",@"j"];
NSArray *arr = @[arr1,arr2];
// 对arr进行forin进行遍历
for (NSArray *temp in arr) {
  for(NSString *str in temp){
      NSLog(@"%@",str);
  }
}

打印结果:

2015-07-21 19:02:43.737 OC05_数组[2937:186020] a
2015-07-21 19:02:43.738 OC05_数组[2937:186020] b
2015-07-21 19:02:43.738 OC05_数组[2937:186020] c
2015-07-21 19:02:43.739 OC05_数组[2937:186020] d
2015-07-21 19:02:43.739 OC05_数组[2937:186020] e
2015-07-21 19:02:43.739 OC05_数组[2937:186020] f
2015-07-21 19:02:43.739 OC05_数组[2937:186020] g
2015-07-21 19:02:43.739 OC05_数组[2937:186020] h
2015-07-21 19:02:43.739 OC05_数组[2937:186020] i
2015-07-21 19:02:43.739 OC05_数组[2937:186020] j

用forin遍历每个学生的姓名

    Student *stu1 = [[Student alloc] initWithName:@"asd"];
    Student *stu2 = [[Student alloc] initWithName:@"qwe"];
    Student *stu3 = [[Student alloc] initWithName:@"zxc"];
    Student *stu4 = [[Student alloc] initWithName:@"yui"];
    NSArray *arr = @[stu1,stu2,stu3,stu4];
// 遍历每个学生的姓名
    for (Student *stu in arr) {
        NSLog(@"%@",stu.name);
    } 

// 遍历嵌套的数组的学生名 
    NSArray *arr1 = @[stu1,stu2,stu3];
    NSArray *arr2 = @[stu4];
    NSArray *arr = @[arr1,arr2];
    for (NSArray *temp in arr) {
        for (Student *stu in temp) {
            NSLog(@"%@",stu.name);
        }
    }

打印结果相同,都为:

2015-07-21 19:06:38.521 OC05_数组[2983:188242] asd
2015-07-21 19:06:38.522 OC05_数组[2983:188242] qwe
2015-07-21 19:06:38.522 OC05_数组[2983:188242] zxc
2015-07-21 19:06:38.522 OC05_数组[2983:188242] yui

注意: initWithArray和initWithObjects初始化的区别
如:

    NSArray *testArr  = @[@"1",@"2",@"3"];    
    NSArray *arr = [[NSArray alloc] initWithArray:testArr];
    NSArray *arr1 = [[NSArray alloc] initWithObjects:testArr, nil];
    NSLog(@"%@",arr1);
    NSLog(@"%@",arr);

打印结果:

2015-07-21 19:09:24.646 OC05_数组[3007:189866] (
        (
        1,
        2,
        3
    )
)
2015-07-21 19:09:24.646 OC05_数组[3007:189866] (
    1,
    2,
    3
)

用initWithObjects打印后,会发现相较于initWithArray,初始化的是将数组作为数组里的对象来初始化.(多了个括号).而initWithArray是将整个数组进行初始化

可变数组

创建可变数组的方式:

1.初始化方法

NSMutableArray *arr = [[NSMutableArray alloc] init];

2.便利构造器

NSMutableArray *arr1 = [NSMutableArray array];
可变数组的简单操作

添加一个字符串

[arr addObject:(@"5")];
NSLog(@"%@",arr);

移除下标为2的字符串

[arr removeObjectAtIndex:2];
NSLog(@"%@",arr);

插入一个字符串

[arr insertObject:@"3" atIndex:2];
NSLog(@"%@",arr);

替换一个字符串

[arr replaceObjectAtIndex:4 withObject:@"8"];
NSLog(@"%@",arr);

交换两个字符串

[arr exchangeObjectAtIndex:0 withObjectAtIndex:4];
NSLog(@"%@",arr);

清空数组

[arr removeAllObjects];
NSLog(@"%@",arr);

创建一个数组输出上列的打印结果:

    NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3",@"4", nil];
//    添加一个字符串
    [arr addObject:(@"5")];
    NSLog(@"%@",arr);
//    移除下标为2的字符串
    [arr removeObjectAtIndex:2];
    NSLog(@"%@",arr);
//    插入一个字符串
    [arr insertObject:@"3" atIndex:2];
    NSLog(@"%@",arr);
//    替换一个字符串
    [arr replaceObjectAtIndex:4 withObject:@"8"];
    NSLog(@"%@",arr);
//    交换两个字符串
    [arr exchangeObjectAtIndex:0 withObjectAtIndex:4];
    NSLog(@"%@",arr);
//    清空数组
    [arr removeAllObjects];
    NSLog(@"%@",arr);

打印结果:

2015-07-21 19:19:25.575 OC05_数组[3044:195005] (
    1,
    2,
    3,
    4,
    5
)
2015-07-21 19:19:25.575 OC05_数组[3044:195005] (
    1,
    2,
    4,
    5
)
2015-07-21 19:19:25.575 OC05_数组[3044:195005] (
    1,
    2,
    3,
    4,
    5
)
2015-07-21 19:19:25.576 OC05_数组[3044:195005] (
    1,
    2,
    3,
    4,
    8
)
2015-07-21 19:19:25.576 OC05_数组[3044:195005] (
    8,
    2,
    3,
    4,
    1
)
2015-07-21 19:19:25.576 OC05_数组[3044:195005] (
)

代码练习1

图书管理。
1、使用可变数组管理所有书籍(定义Book类,包含书 名和价格)。
2、数组可以添加、删除书籍。
3、可以从数组根据书名查找书籍,并修改书籍的价格
4、展示所有书籍清单(书名)。
5、找到价格在70 - 100内有多少本书,把符合条件的书放在一个数组里
6、找到价格为100的书,将其名字变为论语
main.m

    Book *book1 = [Book bookWithBookName:@"水浒传" bookPrice:30];
    Book *book2 = [Book bookWithBookName:@"红楼梦" bookPrice:100];
    Book *book3 = [Book bookWithBookName:@"西游记" bookPrice:80];
    Book *book4 = [Book bookWithBookName:@"三国演义" bookPrice:70];
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:book1,book2,book3,book4,nil];
//     对数组进行添加和删除的操作
    [arr addObject:[Book bookWithBookName:@"程序猿" bookPrice:100]];
    for (Book *all in arr) {
        NSLog(@"%@,%g",all.bookName,all.bookPrice);
    }
    NSLog(@"\n");

    [arr removeObjectAtIndex:0];
    for (Book *all in arr) {
        NSLog(@"%@,%g",all.bookName,all.bookPrice);
    }
    NSLog(@"\n");

    [arr replaceObjectAtIndex:1 withObject:[Book bookWithBookName:@"水浒传,插图" bookPrice:20]];
    for (Book *all in arr) {
        NSLog(@"%@,%g",all.bookName,all.bookPrice);
    }
    NSLog(@"\n");
    // 在数组中根据书名查找对应的书,并对书的价格进行修改
    for (Book *all in arr) {
        if ([all.bookName isEqualToString:@"三国演义"]) {
            all.bookPrice = 30;
        }
    }
    for (Book *all in arr) {
        NSLog(@"%@,%g",all.bookName,all.bookPrice);
    }
    NSLog(@"\n");
    // 展示书的清单
    for (Book *book in arr) {
        NSLog(@"%@,%g",book.bookName,book.bookPrice);
    }
    NSLog(@"\n");
    // 找到价格在70 - 100内有多少本书,把符合条件的书放在一个数组里
    NSMutableArray *newBook = [NSMutableArray array];
    for (Book *temp in arr) {
        if (temp.bookPrice >= 70 && temp.bookPrice <=100) {
            [newBook addObject:temp];
        }
    }
    for (Book *temp in newBook) {
        NSLog(@"%@,%g",temp.bookName,temp.bookPrice);
    }
    NSLog(@"\n");
    // 找到价格是100的书,把书名改成论语
    for (Book *all in arr) {
        if (all.bookPrice == 100) {
            all.bookName = @"论语";
        }
    }
    for (Book *all in arr) {
        NSLog(@"%@,%g",all.bookName,all.bookPrice);
    }
    NSLog(@"\n");

Book.h

@interface Book : NSObject
@property(nonatomic,copy)NSString *bookName;
@property(nonatomic,assign)CGFloat bookPrice;

-(id)initWithBookName:(NSString *)bookName
            bookPrice:(CGFloat)bookPrice;
+(id)bookWithBookName:(NSString *)bookName
            bookPrice:(CGFloat)bookPrice;
@end

Book.m

#import "Book.h"
@implementation Book
-(id)initWithBookName:(NSString *)bookName
            bookPrice:(CGFloat)bookPrice
{
    if(self = [super init]){
        _bookName = bookName;
        _bookPrice = bookPrice;
    }
    return self;
}
+(id)bookWithBookName:(NSString *)bookName
            bookPrice:(CGFloat)bookPrice
{
    Book *book = [[Book alloc]initWithBookName:bookName bookPrice:bookPrice];
    return book;
}
@end

代码练习2

省市区(有专门的txt文本,大概形式如下)

北京 1
  北京市 1
    西城区 1
    东城区 2
    崇文区 3
    宣武区 4
    朝阳区 5
    丰台区 6
    石景山区 7
    海淀区 8
    门头沟区 9
    房山区 10
    通州区 11
    顺义区 12
    昌平区 13
    大兴区 14
    怀柔区 15
    平谷区 16
    密云区 17
    延庆区 18
天津 2
  天津市 2
    和平区 19
    河东区 20
    河西区 21
    南开区 22
    河北区 23
    红桥区 24
    塘沽区 25
    汉沽区 26
    大港区 27
    东丽区 28
    西青区 29
    津南区 30
    北辰区 31
    武清区 32
    宝坻区 33
    宁河县 34
    静海县 35
    蓟县 36

要求:
注:路径就是把txt文本拖入工程后,再拖进代码段

// 先找到文件对应的路径
NSString *path = @"/Users/dllo/Desktop/area.txt";
// 通过路径产生字符串,内容就是txt文本的内容
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", str );

1.以”\n”作为标识,将字符串分割为小的字符串,保存到大的数组中

NSArray *strArr = [str componentsSeparatedByString:@"\n"];

2.把所有的省的字符串放到一个数组中

NSMutableArray *proArr = [NSMutableArray array];
for (NSString *temp in strArr) {
        // 如果没有空格,对应的就是省
    if (![temp hasPrefix:@" "]) {
      [proArr addObject:temp];
    }
}
for (NSString *proName in proArr) {
    NSLog(@"%@",proName);
}

3.一个大数组嵌套进去包含省的数组,在省的数组中嵌套市的数组

NSArray *strArr = [str componentsSeparatedByString:@"\n"];
NSMutableArray *proArr = [NSMutableArray array];
for (NSString *temp in strArr) {
// 只要碰到省对应的字符串,就创建一个可变的市数组
   if (![temp hasPrefix:@" "]) {
     NSMutableArray *cityArr = [NSMutableArray array];
// 创建完成之后,把创建的数组放到省数组中
     [proArr addObject:cityArr];
   } else if ([temp hasPrefix:@"  "]&&![temp hasPrefix:@"    "]){
// 通过lastobject获取要装字符串的市数组
NSMutableArray *cityArr = [proArr lastObject];
// 把城市的字符串放到数组中
      cityArr addObject:temp];
        }
    }
for (NSMutableArray *tempArr in proArr) {
    for (NSString *str in tempArr) {
        NSLog(@"%@",str);
     }
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值