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接收对象就可以了.

 

时间: 2025-01-21 16:26:01

NSArray排序方法讲解的相关文章

NSArray排序

main函数: 1 // 2 // main.m 3 // NSArray排序 4 // 5 // Created by dingxiaowei on 13-5-13. 6 // Copyright (c) 2013年 dingxiaowei. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 #import "Student.h" 11 #pragma mark - 派生出新数组 12 v

Java ArrayList的不同排序方法_java

由于其功能性和灵活性,ArrayList是 Java 集合框架中使用最为普遍的集合类之一.ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在添加和移除元素的时候进行动态的扩展和缩减.你可能已经使用过 ArrayList,因此我将略过基础部分.如果你对 ArrayList 还不熟悉,你可以参考它的 API 文档,可以很容易理解在 ArrayList 上执行基本的操作. 在这篇文章中,我将讨论 ArrayList 中一种极其重要的操作,你很

iOS7中UIView的animateKeyframesWithDuration方法讲解

iOS7中UIView的animateKeyframesWithDuration方法讲解 在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那就是animateKeyframesWithDuration 以下是使用源码: // // ViewController.m // // Created by YouXianMing on 14/11/26. // Copyright (c) 2014年 YouXianMing. All right

&amp;#106avascript 的几种排序方法

排序|排序 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.其确切定义如下: 输入:n个记录R1,R2,-,Rn,其相应的关键字分别为K1,K2,-,Kn. 输出:Ril,Ri2,-,Rin,使得Ki1≤Ki2≤-≤Kin.(或Ki1≥Ki2≥-≥Kin). 这里,我们简单介绍几种排序方法,直接插入排序.希儿排序.冒泡排序.快速排序.直接选择排序,文中所提及的代码在IE6下测试通过. 直接插入排序基本思想 假设待排序的记录存放在数组R[1..n]中.初始时,R[1]自成

javascript 的几种排序方法

javascript|排序 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.其确切定义如下: 输入:n个记录R1,R2,-,Rn,其相应的关键字分别为K1,K2,-,Kn. 输出:Ril,Ri2,-,Rin,使得Ki1≤Ki2≤-≤Kin.(或Ki1≥Ki2≥-≥Kin).     这里,我们简单介绍几种排序方法,直接插入排序.希儿排序.冒泡排序.快速排序.直接选择排序,文中所提及的代码在IE6下测试通过. 直接插入排序基本思想    假设待排序的记录存放在数组R[1.

七种qsort排序方法

七种qsort排序方法 <本文中排序都是采用的从小到大排序> 一.对int类型数组排序 C/C++ code int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二.对char类型数组排序(同int类型) C/C++ code char word[100]; Sample: int

JavaScript中用于四舍五入的Math.round()方法讲解

  这篇文章主要介绍了JavaScript中用于四舍五入的Math.round()方法讲解,是JS入门学习中的基础知识,需要的朋友可以参考下 此方法返回一个数四舍五入为最接近的整数的值. 语法 ? 1 Math.round( x ) ; 下面是参数的详细信息: x: 一个数字 返回值: 返回数字四舍五入为最接近的整数的值. 例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <html> <head> <ti

如何给输入法设置排序方法?

  相信很多朋友都会在自己的电脑里面安装自己熟悉的输入法,这些输入法由于安装顺序等种种原因,造成输入法排序乱七八糟的,使得我们要按好多次Ctrl+Shift才能找到我们想用的输入法(当然可以给每个输入法设置快捷键,这里只讨论输入法排序问题),下面就介绍一下如何给输入法设置排序方法. 方法一:修改注册表(看起来麻烦,实际上非常简单) ①开始→运行→输入regedit,打开注册表编辑器,找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlKeyboar

Python中的pass语句使用方法讲解

  这篇文章主要介绍了Python中的pass语句使用方法讲解,是Python入门学习中的基础知识,需要的朋友可以参考下 Python pass语句使用当语句要求不希望任何命令或代码来执行. pass语句是一个空(null)操作;在执行时没有任何反应.pass也是代码最终会是有用的,但暂时不用写出来(例如,在存根为例): 语法 Python pass语句语法如下: ? 1 pass 例子 ? 1 2 3 4 5 6 7 8 9 #!/usr/bin/python   for letter in