Objective-C学习-数组排序问题

【学习ios之路:Objective-C】OC中常用的系统排序方法 ①.OC中常用排序方法: 1).不可变数组 - (NSArray *)sortedArrayUsingSelector:(SEL)comparator; - (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr; 2)可变数组 - (void)sortUsingSelector:(SEL)comparator; - (voi 阅读详情

       学到数组的时候,经常为了数据排序因为排序问题烦恼,楼主也是如此,其实objc为我们提供了很好的排序机制,如下代码加文字来解释一下


通过NSString自带的比较方法排序(也是最简单的方法)

//
//  main.m
//  NSArraySort (数组排序)博客
//
//  Created by YueWen on 15/9/13.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//

    //首先定义一个数组
    NSArray * array = @[@"Boy",@"Array",@"Dary",@"Car"];
    
    /**
     *  用里面元素自带的方法进行排序,默认为升序,因为是字符串,所以我们可以用 NSString 拥有的compare方法来进行默认排序
     *
     *  @param compare: 字符串的比较方法compare 返回的类型,在之前的数组文章中也已经讲过了
     *
     *  @return 返回一个接收的数组
     *
     *  运行结果为: sortArray1 = @[@"Array",@"Boy",@"Car",@"Dary"]
     */
    NSArray * sortArray1 = [array sortedArrayUsingSelector:@selector(compare:)];


通过在进行比较时后面的 Block 代码块来进行比较

这种比较相对的比较好用,举个例子来看


升序:

 /* 
     如果是自定义的类进行比较呢 以 Student 为例
     我们默认有3个属性
     @property(nonatomic,strong)NSString * name;
     @property(nonatomic,strong)NSString * studentId;
     @property(nonatomic,strong)NSString * age;
     */
    
    
    //首先定义3个学生
    Student * student1 = [[Student alloc]initWithName:@"张三" withStudentId:@"010" withAge:@"12"];
    Student * student2 = [[Student alloc]initWithName:@"张三" withStudentId:@"020" withAge:@"11"];
    Student * student3 = [[Student alloc]initWithName:@"刺客" withStudentId:@"008" withAge:@"16"];
    
    //添加到数据
    NSArray * array2 = @[student1,student2,student3];
    
    /**
     *  通过block代码块进行排序,我们可以自定义排序
     *
     *  @param obj1 比较对象的第一对象
     *  @param obj2 比较对象的第二对象
     *
     *  @return 返回的是比较的结果
     *
     *  运行结果是:sortArray2 = @[student3,student1,student2];
     */
    NSArray * sortArray2 = [array2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
       
        //比如我想通过序号id来进行排序
        
        //获取比较的对象(如果不写这两行也可以,在后面的比较处强制转换一下也是可以的)
        Student * sObj1 = (Student *)obj1;
        Student * sObj2 = (Student *)obj2;
        
        //获取比较的结果,因为是枚举类型,所以不需要加 *(如果需要姓名的排序,当然,这里的对比对象变成name即可,但是比较的双方位置是不可交换的,交换之后比较的结果也会发生变化)
        NSComparisonResult  result = [sObj1.studentId compare:sObj2.studentId];
        
        //返回结果
        return result;
        
    }];


逆序:

//如果我不想按照默认的升序排呢,想降序,当然也是可以的
    /**
     *  通过block代码块进行排序,我们可以自定义的降序排序
     *
     *  @param obj1 比较对象的第一对象
     *  @param obj2 比较对象的第二对象
     *
     *  @return 返回的是我们告知它排序的结果
     *
     *  运行结果是:sortArra2_1 =  @[student3,student1,student2];
     */
    NSArray * sortArray2_1 = [array2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        
        //这次我们就按照年龄排序吧
        
        //依旧获取对象
        Student * sObj1 = (Student *)obj1;
        Student * sObj2 = (Student *)obj2;
        
        //获取比较结果
        NSComparisonResult result = [sObj1.age compare:sObj2.age];
        
        switch (result) {
            //如果是升序,那么就表示前边的小,那么我们就告知它需要降序
            case NSOrderedAscending:
                return NSOrderedDescending;
                break;
            //如果是降序,那么就表示前边的元素大,我们就告知它是升序,就不需要交换了
            case NSOrderedDescending:
                return NSOrderedAscending;
                break;
            //如果是相等,那么我们就不需要排序了,也就告知它确实是相等的就可以
            case NSOrderedSame:
                return NSOrderedSame;
                break;
            default:
                break;
        }
        
    }];


NSSortDescriptor排序

其实现在看来,这种排序方法一般用来解决比较复杂的结构问题,比如复合排序问题,但是描述却是很简单的,看代码量比第二种方法少了不少,一般的排序上面的两种都可以解决的,但是为了好理解,用了一个比较简单的实例来展示一下,代码如下:

/*
     如果我们想先通过年龄排序,如果相同,我们再按照姓名进行排序呢
     当然,这种排序也是可以的
     那么我们需要用到另一种类型: 叫做NSSortDescriptor (排序描述)
     */
    
    //首先我们为了验证,我们需要改一下我们之前的Student类对象
    /*
     //首先定义3个学生
     Student * student1 = [[Student alloc]initWithName:@"张三" withStudentId:@"010" withAge:@"12"];
     Student * student2 = [[Student alloc]initWithName:@"张三" withStudentId:@"009" withAge:@"11"];
     Student * student3 = [[Student alloc]initWithName:@"刺客" withStudentId:@"008" withAge:@"16"];
     
     那么我们的需求是什么呢,先按照名字升序,如果名字相同,那么我们就要看年龄
     */
    
    //首先我们先把student加到数组中
    NSArray * array3 = @[student1,student2,student3];
    

    /**
     *  然后就要定义我们的排序描述了
     *  以下的意思就是说,我对比的凭据是 name 属性, ascending 是否升序排列
     */
    NSSortDescriptor * descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    NSSortDescriptor * descriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];

    /**
     *  我们为数组添加排序描述
     *  首先我们按照第1个描述来排列,如果相等,我们再会按照第2个排序描述来排序
     *
     *  运行结果是: sortArray3 = @[student3,student2,student1];
     */
    NSArray * sortArray3 = [array3 sortedArrayUsingDescriptors:@[descriptor1,descriptor2]];

Objective-C语言的学习路线 学习Objective-C的过程既是充实自己编程能力的过程,也是探索苹果生态圈的旅程。从基础语法到进阶的内存管理,再到实践项目的开发,都是一个逐步深入的过程。虽然Swift语言崭露头角,但了解Objective-C依然是iOS和macOS开发者不可或缺的一部分。希望这条学习路线能为大家提供帮助,让你在Objective-C的学习道路上走得更远、更坚定。 阅读详情

相关推荐

Objective-C中NSMutableArray的创建及使用

现阶段在iOS开发中,我们使用最多的语言还是Objective-C。而在Objective-C中,我们常常用到NSMutableArray可变数组,对于有经验程序猿而言,这可能是非常简单的基础知识,但是对于初学者而言却是学习中必须掌握的知识点。废话不多说,下面一起来学习学习Objective-C  NSMutableArray的创建和使用吧。            NSMutableArray

qwemaizi的博客 1258

Objective C之数组排序

大体上,OC中常用的数组排序有以下几种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 1、简单排序(sortedArrayUsingSelector:)如果只是对字符串的排序,可以

凉城旧梦的博客 956

Objective-c学习笔记05——NSArray(NSMutableArray)

Objective-C可以开发apple家族系列产品的软件,这里记录成笔记方便日后复习: Objective-c学习笔记01——简介 Objective-c学习笔记02——类(面向对象) Objective-c学习笔记03——内存管理 Objective-c学习笔记04——NSString Objective-c学习笔记05——NSArray(NSMutableArray) O

Simple man 2553

sortDescriptorWithKey 进行时间排序

NSDictionary *dict1 = @{@"CreateTime":@"2015/12/3 10:03:32"}; NSDictionary *dict2 = @{@"CreateTime":@"2015/12/3 10:02:53"}; NSDictionary *dict3 = @{@"CreateTime":@"2015/12/3 9:59:31"};  NSDic

laobenlrb的博客 4029

【IOS 开发学习总结-OC-7.11-★】 objective-c——指针数组和指向指针的指针

指针数组与 main() 函数形参有时需要一次声明具有多个相同特征的指针变量,此时可借助,指针数组来实现。指针数组使用最多的地方是处理字符串数组的情况,由于字符串本身需要使用 char * 型指针变量来表示,当程序中有多个字符串要保存时,就可以借助指针数组。声明指针数组与声明普通数组的语法类型:语法格式:类型* 数组变量[长度]; 注意与类型 (*变量名)[长度];的语法格式相区分。 区别在于:

Albert的专栏 3197

Objective-C实现冒泡排序(附完整源码)

Objective-C实现冒泡排序(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 165

Objective C中数组排序的三种方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34054866的博客 195

objective-c数组全排列算法

用objective-c实现全排列算法,用数组来保存全排列排列的结果

Objective-C 对象按属性排序 过滤

使用NSMutavleArray 变长数组 建立一个Person对象,一个id属性和一个name属性,自定义了一个init方法,修改了description方法方便查看排序 //Person.h @interface Person : NSObject @property(nonatomic) unsigned int personId; @property(nonatomic,weak) ...

Castanea的博客 408

量化实战:如何用Barra多因子模型给你的投资组合做一次‘风险体检’?

本文详细介绍了如何利用Barra多因子模型对投资组合进行全面的风险体检,帮助投资者识别行业和风格因子的风险暴露。通过实战案例和Python代码示例,展示了数据采集、风险归因和组合优化的完整流程,提升投资组合的风险调整收益。

weixin_27215337的博客 323

从零到精通:ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程

本文详细介绍了ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程,从环境准备到高级功能扩展,帮助开发者实现精准控制。通过集成模型预测控制(MPC),机械臂能够优化复杂轨迹规划,处理动态避障,提升工业自动化效率。

juice的博客 705

Objective-C 基础知识之(十): OC中的排序方法

OC中的排序 排序: 1、OC中的冒泡排序(数组) 创建可变数组:NSMutableArray *array = [NSMutableArray arrayWithObjects:@"20", @"10",@"40", @"30", nil]; 按照升序进行排列 for (int i = 0; i    for (int j = 0; j      NSString * str1

leleyuan1130的博客 1287

POSS-NH2:氨基化笼型聚半倍硅氧烷的合成与应用探索

本文详细介绍了氨基化笼型聚半倍硅氧烷(POSS-NH2)的合成方法与应用。通过水解缩合与官能团转化两种主流路线,可制备出这种关键的纳米增强材料。其核心价值在于通过表面的氨基与树脂基体形成化学键合,从而显著提升复合材料的热稳定性和机械性能。文章以环氧树脂改性为例,展示了POSS-NH2在航空航天、电子封装等高性能领域的应用潜力。

grpc6streamer的博客 498

EKAlgorithms 项目推荐

EKAlgorithms 项目推荐 EKAlgorithms EKAlgorithms contains some well known CS algorithms & data structures. 项目地址: https:/...

gitblog_00002的博客 438

知识的定义与分类体系详解 - 从零基础到专业理解

知识的定义与分类体系详解 - 从零基础到专业理解

engchina的专栏 4364

完整复现YOLOv8:包括训练、测试、评估、预测阶段【本文源码已开源,地址在文章末尾】

(这里主要是在colab.research.google.com实现的,本地的配置也是类似的方法)YOLOv8是一种用于目标检测的深度学习算法。主要参考:https://github.com/ultralytics/ultralytics/blob/main/README.zh-CN.md。yolov8的权重:https://github.com/ultralytics/assets/releases。yolov8的文档:https://v8docs.ultralytics.com/

源代码杀手的博客 1万+

Objective-C语言的排序算法

排序算法可以分为两大类:内部排序和外部排序。内部排序是指在内存中对数据进行排序,而外部排序则是处理数据量大于内存时的排序。冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort)快速排序(Quick Sort)归并排序(Merge Sort)接下来,我们将详细探讨这些排序算法的原理、时间复杂度以及如何在Objective-C中实现它们。排序算法在数据处理、数据库管理和大数据分析等领域起着至关重要的作用。

2501_91439300的博客 573

企业 IoT 产品安全渗透测试与欧盟 CRA 合规落地实战指南

欧盟 CRA(网络弹性法案)2026-09-11 漏洞报告义务生效,2027-12-11 全面强制产品安全不再是"加分项",而是市场准入的法律门槛本文面向 IoT 企业安全工程师/运维工程师,讲清楚如何从零建立渗透测试能力,并与 CRA 合规要求对齐落地。不讲空话,全是可执行的步骤。IoT 企业安全工程师、运维工程师负责产品合规的技术人员想从"被动响应"转向"主动安全"的团队[ ] 能独立完成 Web 应用渗透测试并输出报告[ ] 能对 REST/GraphQL API 进行安全评估。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 268

Objective-C如何使用对象集合学习系列之一

数组在列表中组织对象,列表通过整数进行索引。 字典通过键组织对象;字典中的每个对象都与某个键相关联,可以通过键检索对象。 集合包含对象,但不要假定这些对象以一定的顺序排列。集合中的对象也必须是唯一的(不能重复)。从集合中检索对象是非常快的,因为集合没有索引带来的系统开销。因此,你会看到在需要考虑性能的场合下会用到集合。

ZhouJoLoker的专栏 2549

【Claude Code】Unable to connect to API 报错原因与排查解决全流程

深入分析 Claude Code 中 Unable to connect to API 系列报错的根因,涵盖 ECONNREFUSED、ECONNRESET、ETIMEDOUT 等 6 种变体,提供从网络连通性检测、代理配置到 LLM 网关路由的完整排查路径,帮助开发者快速恢复 Claude Code 的正常使用。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 2843

零基础教你学RDMA驱动开发:从入门到精通--第6章 内存管理与DMA映射​6.2 DMA地址转换:内核dma_map_single()与硬件IOVA(I/O虚拟地址)​

本文深入探讨RDMA驱动中DMA地址转换机制,重点分析内核dma_map_single()函数与硬件IOVA的作用。主要内容包括:1)DMA地址转换的必要性,解决CPU虚拟地址与HCA设备DMA地址的空间割裂问题;2)内核DMA映射机制实现原理,涵盖无IOMMU(直接物理地址映射)和有IOMMU(IOVA转换)两种场景;3)硬件IOVA的工作流程及其与RDMA内存注册的结合;4)RDMA驱动开发中的关键问题,如缓存一致性、映射方向错误、IOVA泄漏等;5)以mlx5驱动为例的实践分析。文章强调DMA地址转换

xiaoheshang_123的博客 239

oc数组排序 及转换关系

下面是我对oc语言数组排序这一块知识点的理解,有不对的地方还请多多指点。

zgw8543的博客 680

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OC学习之道:关于数组的四种排序

// Copyright (c) 2015年 童星. All rights reserved. // Person.h #import @interface Person : NSObject{ int _age; NSString *_name; } //set方法main.m -(void)setAge:(int)age; -(void)setN

朝夕 1654

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: iOS开发-------简单通讯录2(UISearchController)
下一篇: Objective-C学习-KVC(键值编码)和KVO(键值观察)
RITL
博客等级 码龄11年 69粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值