OC笔记,数组NSArray

本文详细介绍了Objective-C中数组的创建、遍历方法及可变数组的使用技巧。包括三种常用的数组遍历方式:枚举器法、快速枚举法和使用索引遍历,并演示了如何使用可变数组进行元素的增删改操作。

创建数组。

3种常用方法遍历数组。

可变数组NSMutableArray。

所有的笔记记录在代码的注释中,几乎一句一注释,通俗易懂。

代码部分如下:

#import <Foundation/Foundation.h>
#import "Dog.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray * array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
        // 数组的元素可以是任意的对象。
        // 数组中装有元素的地址,而不是对象的本体。
        // 所以一个对象@"One"可以放在两个数组中。即两个数组可以装同一个对象的地址。
        // 数组更接近于C当中的链表
        
        // 遍历打印数组中的每个元素
        NSLog(@"%@", array);
        // 打印数组,就是打印了数组中的每一个元素。
        // 任何一个对象,使用%@去打印,就是打印这个对象的description方法的返回值。
        
        // 在dog类中重写了description方法,用%@打印dog,则会调用该方法。
        Dog * dog = [[Dog alloc] init];
        NSLog(@"%@", dog);
        
        // Dog中有description方法,则dog对象也可以放到数组中。
        NSArray * array2 = [[NSArray alloc] initWithObjects:@"One", @"Two", dog, nil];
        NSLog(@"array2: %@", array2);
        // 打印结果中This is a dog外面加了双引号,是因为他有多个单词。
        
        // 遍历数组的3种方法
        
        // 枚举器法
        // 创建一个枚举器,使用数组的元素创建一个枚举器。
        NSEnumerator * enumerator = [array objectEnumerator];
        id obj;
        // 该方法第一次返回数组中第一个元素的地址,第二次返回第二个地址....最后一次返回nil
        // 返回nil的时候,赋值表达式的值也是nil,循环结束
        while (obj = [enumerator nextObject]) {
            NSLog(@"enumerator array: %@", obj);
        }
        
        // 快速枚举法
        for (id obj2 in array) {
            NSLog(@"fast enumerator array: %@", obj2);
        }
        
        // 使用i值遍历
        // 数组中有两个方法
        // [array count]方法返回数组元素的个数
        // [array objectAtIndex:]方法返回单个元素的地址
        NSInteger i;
        for (i = 0; i < [array count]; i++) {
            NSLog(@"i with array loop: %@", [array objectAtIndex:i]);
        }
        
        // 以上的数组均是不可变数组,在创建之后元素的个数和顺序不可变
        
        // 可变数组 MutableArray
        
        NSMutableArray * mArray = [[NSMutableArray alloc] init];
        
        // 增加元素
        [mArray addObject:@"mOne"];
        [mArray addObject:@"mTwo"];
        [mArray addObject:@"mThree"];
        NSLog(@"MutableArray mArray: %@", mArray);
        
        // 删除元素
        // [mArray removeObject:@"mOne"];
        // NSLog(@"removeObject mArray: %@", mArray);
        // 用@”“创建的字符串对象,如果完全一样,那么就是同一个对象,地址一样。
        // 删除指定的第几个字符串
        // [mArray removeObjectAtIndex:1];
        // NSLog(@"remove at Index mArray: %@", mArray);
        
        // 交换两个数组元素的位置
        [mArray exchangeObjectAtIndex:0 withObjectAtIndex:2];
        NSLog(@"exchange mArray: %@", mArray);
        
        // 可变字符串数组也可以像不可变数组那样遍历
        // 但是在枚举遍历中不能删除数组中的元素
//        NSMutableArray * mmArray = [[NSMutableArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
//        NSEnumerator * enu = [mmArray objectEnumerator];
//        NSString * mStr;
//        while (mStr = [enu nextObject]) {
//            [mmArray removeLastObject];
//        }
//        NSLog(@"enumerator mmArray: %@", mmArray);
        // 程序发生奔溃
        // 实际上只有第一次循环可以执行
        // 当对第一次数组进行修改之后
        // 第二次使用枚举法遍历就会奔溃
        
        // 但是,如果我们进行逆序遍历,生成一个逆序枚举器,再修改就没有任何问题。
        NSMutableArray * mmArray = [[NSMutableArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
        NSEnumerator * enu = [mmArray reverseObjectEnumerator];
        NSString * mStr;
        while (mStr = [enu nextObject]) {
            [mmArray removeLastObject];
            NSLog(@"%@", mStr);
        }
        NSLog(@"%@", mmArray);
        
        // 快速枚举法不能修改,i值可以随意修改
        
        // 数组和字符串的联合使用
        NSString * sstr = @"I am a so bad man";
        // 按每个单词分开逆序表示
        // 首先将字符串进行分割,分割出的字符串放在数组中
        // 函数按参数分割字符串,创建一个数组,返回数组的地址
        NSArray * sArray = [sstr componentsSeparatedByString:@" "];
        NSLog(@"sArray: %@", sArray);
        // 创建一个空的可变数组
        NSMutableArray * mutaleArray = [[NSMutableArray alloc] init];
        // 对数组sArray逆序的遍历
        NSEnumerator * enumerator1 = [sArray reverseObjectEnumerator];
        NSString * obj1;
        while (obj1 = [enumerator1 nextObject]) {
            // 一次添加到mutableArray数组里面
            [mutaleArray addObject:obj1];
        }
        NSLog(@"mutableArray: %@", mutaleArray);
        // 再拼回成字符串
        // 用参数连接数组中的每个字符串
        NSString * newStr = [mutaleArray componentsJoinedByString:@" "];
        NSLog(@"%@", newStr);
        
    }
    return 0;
}

打印结果如下:

2015-06-02 14:45:56.268 NSArray[16559:4906236] (
    One,
    Two,
    Three
)
2015-06-02 14:45:56.269 NSArray[16559:4906236] This is a dog!
2015-06-02 14:45:56.269 NSArray[16559:4906236] array2: (
    One,
    Two,
    "This is a dog!"
)
2015-06-02 14:45:56.274 NSArray[16559:4906236] enumerator array: One
2015-06-02 14:45:56.274 NSArray[16559:4906236] enumerator array: Two
2015-06-02 14:45:56.274 NSArray[16559:4906236] enumerator array: Three
2015-06-02 14:45:56.275 NSArray[16559:4906236] fast enumerator array: One
2015-06-02 14:45:56.275 NSArray[16559:4906236] fast enumerator array: Two
2015-06-02 14:45:56.275 NSArray[16559:4906236] fast enumerator array: Three
2015-06-02 14:45:56.275 NSArray[16559:4906236] i with array loop: One
2015-06-02 14:45:56.275 NSArray[16559:4906236] i with array loop: Two
2015-06-02 14:45:56.275 NSArray[16559:4906236] i with array loop: Three
2015-06-02 14:45:56.276 NSArray[16559:4906236] MutableArray mArray: (
    mOne,
    mTwo,
    mThree
)
2015-06-02 14:45:56.276 NSArray[16559:4906236] exchange mArray: (
    mThree,
    mTwo,
    mOne
)
2015-06-02 14:45:56.276 NSArray[16559:4906236] Three
2015-06-02 14:45:56.276 NSArray[16559:4906236] Two
2015-06-02 14:45:56.276 NSArray[16559:4906236] One
2015-06-02 14:45:56.276 NSArray[16559:4906236] (
)
2015-06-02 14:45:56.276 NSArray[16559:4906236] sArray: (
    I,
    am,
    a,
    so,
    bad,
    man
)
2015-06-02 14:45:56.277 NSArray[16559:4906236] mutableArray: (
    man,
    bad,
    so,
    a,
    am,
    I
)
2015-06-02 14:45:56.277 NSArray[16559:4906236] man bad so a am I
内容概要:本文详细介绍了一个基于C++的养老院管理系统的设计与实现,旨在应对人口老龄化带来的管理挑战。系统通过整合住户档案、健康监测、护理计划、任务调度等核心功能,构建了从数据采集、清洗、AI风险预测到服务调度与可视化的完整技术架构。采用C++高性能服务端结合消息队列、规则引擎和机器学习模型,实现了健康状态实时监控、智能任务分配、异常告警推送等功能,并解决了多源数据整合、权限安全、老旧硬件兼容等实际问题。系统支持模块化扩展与流程自定义,提升了养老服务效率、医护协同水平和住户安全保障,同时为运营决策提供数据支持。文中还提供了关键模块的代码示例,如健康指数算法、任务调度器和日志记录组件。; 适合人群:具备C++编程基础,从事软件开发或系统设计工作1-3年的研发人员,尤其是关注智慧养老、医疗信息系统开发的技术人员。; 使用场景及目标:①学习如何在真实项目中应用C++构建高性能、可扩展的管理系统;②掌握多源数据整合、实时健康监控、任务调度与权限控制等复杂业务的技术实现方案;③了解AI模型在养老场景中的落地方式及系统架构设计思路。; 阅读建议:此资源不仅包含系统架构与模型描述,还附有核心代码片段,建议结合整体设计逻辑深入理解各模块之间的协同机制,并可通过重构或扩展代码来加深对系统工程实践的掌握。
内容概要:本文详细介绍了一个基于C++的城市交通流量数据可视化分析系统的设计与实现。系统涵盖数据采集与预处理、存储与管理、分析建模、可视化展示、系统集成扩展以及数据安全与隐私保护六大核心模块。通过多源异构数据融合、高效存储检索、实时处理分析、高交互性可视化界面及模块化架构设计,实现了对城市交通流量的实时监控、历史趋势分析与智能决策支持。文中还提供了关键模块的C++代码示例,如数据采集、清洗、CSV读写、流量统计、异常检测及基于SFML的柱状图绘制,增强了系统的可实现性与实用性。; 适合人群:具备C++编程基础,熟悉数据结构与算法,有一定项目开发经验的高校学生、研究人员及从事智能交通系统开发的工程师;适合对大数据处理、可视化技术和智慧城市应用感兴趣的技术人员。; 使用场景及目标:①应用于城市交通管理部门,实现交通流量实时监测与拥堵预警;②为市民出行提供路径优化建议;③支持交通政策制定与信号灯配时优化;④作为智慧城市建设中的智能交通子系统,实现与其他城市系统的数据协同。; 阅读建议:建议结合文中代码示例搭建开发环境进行实践,重点关注多线程数据采集、异常检测算法与可视化实现细节;可进一步扩展机器学习模型用于流量预测,并集成真实交通数据源进行系统验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值