NSArray排序方法讲解

简介:

NSArray排序方法讲解

给数组排序有着多种方式

最麻烦的是sortedArrayUsingSelector:,其次是sortedArrayUsingDescriptors:,最容易使用的就是sortedArrayUsingComparator:

从最容易使用的开始吧:

// 原始数组
    NSArray *array = @[@"b", @"a", @"x", @"o", @"g", @"o"];
    
    // 排序数组
    NSArray *sort = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSString *str1 = obj1;
        NSString *str2 = obj2;
        return [str1 compare:str2];
    }];
    
    // 打印排序数组
    [sort enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@", obj);
    }];

这么一行就解决了,实在是太容易了.

要对什么对象排序就用相应的对象接收就行了:)

是不是简单过头了呢.

请记住,用block排序是最简单的方式!

下面来试试sortedArrayUsingDescriptors:这个方法.

sortedArrayUsingDescriptors:一般用来给Model进行排序,block也能对Model进行排序.先给出Model的定义(看教程不要太懒,自己敲代码吧)

以下是排序的代码:

//
//  AppDelegate.m
//  Sort
//
//  http://www.cnblogs.com/YouXianMing/
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "AppDelegate.h"
#import "Model.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self sort];
    
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)sort
{
    // 原始数组
    NSArray *array = @[[Model name:@"YouXianMing" age:@26 height:171],
                       [Model name:@"XiaoQiu"     age:@27 height:170],
                       [Model name:@"HaoQuShi"    age:@28 height:172],
                       [Model name:@"JunGang"     age:@24 height:171],
                       [Model name:@"KongMing"    age:@30 height:175],
                       [Model name:@"GaoFuShuai"  age:@22 height:180]];
    
    // 排序描述信息
    NSSortDescriptor *sortDescriptor  = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray          *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSArray          *sortedArray     = [array sortedArrayUsingDescriptors:sortDescriptors];
    
    // 打印排序信息
    [sortedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        Model *tmp = obj;
        NSLog(@"%@", tmp.name);
    }];
}

@end

看下图,其实呢,NSSortDescriptor只是一个获取keyPath的工具,他能根据keyPath进行排序而已,仅此而已:)

看一下打印信息:

2014-07-01 09:09:43.563 Sort[86442:60b] GaoFuShuai
2014-07-01 09:09:43.565 Sort[86442:60b] HaoQuShi
2014-07-01 09:09:43.565 Sort[86442:60b] JunGang
2014-07-01 09:09:43.566 Sort[86442:60b] KongMing
2014-07-01 09:09:43.566 Sort[86442:60b] XiaoQiu
2014-07-01 09:09:43.567 Sort[86442:60b] YouXianMing

很easy吧.

这种东西还是封装成类目比较好的样子.

使用:

//
//  AppDelegate.m
//  Sort
//
//  http://www.cnblogs.com/YouXianMing/
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "AppDelegate.h"
#import "Model.h"
#import "NSArray+YXSort.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self sort];
    
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)sort
{
    // 原始数组
    NSArray *array = @[[Model name:@"YouXianMing" age:@26 height:171],
                       [Model name:@"XiaoQiu"     age:@27 height:170],
                       [Model name:@"HaoQuShi"    age:@28 height:172],
                       [Model name:@"JunGang"     age:@24 height:171],
                       [Model name:@"KongMing"    age:@30 height:175],
                       [Model name:@"GaoFuShuai"  age:@22 height:180]];
    
    // 排序
    NSArray *sortedArray = [array sortedWithKeyPath:@"name" ascending:YES];
    
    // 打印排序信息
    [sortedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        Model *tmp = obj;
        NSLog(@"%@", tmp.name);
    }];
}

@end

一句话就能实现排序,多简单:),开发就得隐藏不必要的繁文缛节,减少不必要的干扰才是正道.

第三种方法sortedArrayUsingSelector:,也许是你最常用的方法,这个我就不讲了,我觉得太麻烦了,还得另外写一个比较的方法......

 

 

总结:

==本人倾向于这么用==

1. 优先用block排序

2. 用NSSortDescriptor的keyPath排序

3. 再不济请用sortedArrayUsingSelector:方法排序

 

附录:

用block对Model排序一样非常简单直白暴力,只需用Model接收对象就可以了.

 

目录
相关文章
|
算法 Unix
socket套接字选项getsockopt&setsockopt
setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。在Unix网络编程中通常用到getsockopt和setsockopt两个函数来获取和设置套接口的选项。getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。
256 0
SwiftUI—使用Text视图创建漂亮的富文本
SwiftUI—使用Text视图创建漂亮的富文本
1356 0
SwiftUI—使用Text视图创建漂亮的富文本
|
存储 数据管理 数据处理
ArkUI常用数据处理:掌握Map操作与动态数据管理
在HarmonyOS应用开发中,ArkUI框架提供了丰富的数据处理能力,特别是对Map这类非线性容器的操作。本文详细介绍了ArkUI中Map的基本概念、操作方法及其在实际开发中的应用,包括数据存储、快速检索和动态更新。通过示例代码展示了HashMap、HashSet和TreeMap的使用,以及如何结合异步数据处理和状态管理提升应用性能和用户体验。
384 2
|
存储 缓存 网络协议
如何在 Linux 上刷新 DNS 缓存?
【7月更文挑战第14天】
853 0
如何在 Linux 上刷新 DNS 缓存?
|
C++
gRPC 四模式之 服务器端流RPC模式
gRPC 四模式之 服务器端流RPC模式
361 0
|
存储 缓存 监控
【Flutter前端技术开发专栏】Flutter中的列表滚动性能优化
【4月更文挑战第30天】本文探讨了Flutter中优化列表滚动性能的策略。建议使用`ListView.builder`以节省内存,避免一次性渲染所有列表项。为防止列表项重建,可使用`UniqueKey`或`ObjectKey`。缓存已渲染项、减少不必要的重绘和异步加载大数据集也是关键。此外,选择轻量级组件,如`StatelessWidget`,并利用Flutter DevTools监控性能以识别和解决瓶颈。持续测试和调整以提升用户体验。
606 0
【Flutter前端技术开发专栏】Flutter中的列表滚动性能优化
|
前端开发 数据处理
【Flutter 前端技术开发专栏】Flutter 中的滚动性能优化与无限列表实现
【4月更文挑战第30天】本文探讨了 Flutter 中的滚动性能优化和无限列表实现。关键点包括:1) 滚动性能直接影响用户满意度,优化可提升响应速度;2) 影响因素有布局复杂度、频繁重绘和数据处理;3) 优化措施包括懒加载、简化布局、减少不必要的重绘和高效处理数据;4) 无限列表通过监听滚动位置,动态加载新数据;5) 实现时注意加载策略、数据处理效率和内存管理。案例分析和总结强调了优化在实际开发中的重要性。
349 0
【Flutter 前端技术开发专栏】Flutter 中的滚动性能优化与无限列表实现
|
安全 网络协议 数据安全/隐私保护
2020苹果审核被拒绝原因汇总
2020苹果审核被拒绝原因汇总
1032 0
|
存储 安全 Swift
【Swift开发专栏】Swift的懒加载与延迟初始化
【4月更文挑战第30天】Swift中的懒加载和延迟初始化是性能优化的关键技术。懒加载(lazy)推迟了变量直到首次访问时的初始化,减少启动时间和内存消耗。延迟初始化则允许变量在首次访问前保持未初始化状态。这两种方法都能提升应用性能,减少不必要的资源加载,并提高代码组织性。但要注意线程安全、资源管理以及代码可读性。
443 0
|
API 容器
【鸿蒙软件开发】ArkUI之Column、ColumnSplit组件
【鸿蒙软件开发】ArkUI之Column、ColumnSplit组件
576 0
【鸿蒙软件开发】ArkUI之Column、ColumnSplit组件