数组的几种排序方式

    // 1.使用NSComparator排序
    {
        // 产生随机数
        NSMutableArray *unsortDataM = [NSMutableArray array];
        for (NSInteger index = 0; index < 20; index++) {
            int random = arc4random()%20;
            [unsortDataM addObject:@(random)];
        }
        NSLog(@"使用NSComparator排序前的数据:%@",unsortDataM);

        NSArray *sortedData = [unsortDataM sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
            NSInteger value1 = (NSInteger)obj1;
            NSInteger value2 = (NSInteger)obj2;

            if (value1 < value2) {
                return NSOrderedAscending;
            }else {
                return NSOrderedDescending;
            }
        }];

        NSLog(@"使用NSComparator排序后的数据:%@",sortedData);

    }

    // 2.使用NSDescriptor排序
    {
        Person *person1 = [[Person alloc] init];
        person1.age = 39;
        person1.height = 178;

        Person *person2 = [[Person alloc] init];
        person2.age = 25;
        person2.height = 165;

        Person *person3 = [[Person alloc] init];
        person3.age = 55;
        person3.height = 170;

        Person *person4 = [[Person alloc] init];
        person4.age = 15;
        person4.height = 165;

        Person *person5 = [[Person alloc] init];
        person5.age = 38;
        person5.height = 177;

        NSMutableArray *unsortDataM = [NSMutableArray arrayWithObjects:person1,person2,person3,person4,person5, nil];
        NSLog(@"使用NSDescriptor排序前的数据:%@",unsortDataM);

        NSSortDescriptor *firstDescriptor  = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
        NSSortDescriptor *secondDescriptor = [[NSSortDescriptor alloc] initWithKey:@"height" ascending:YES];

        // 第一优先级先按照年龄排,年龄相同的按照第二优先级排序
        NSArray *sortArray = [NSArray arrayWithObjects:firstDescriptor,secondDescriptor,nil];
        NSArray  *sortedData = [unsortDataM sortedArrayUsingDescriptors:sortArray];
        NSLog(@"使用NSDescriptor排序后的数据");
        for (Person *person in sortedData) {
            NSLog(@"age:%d,height:%d",person.age,person.height);
        }
    }

    // 3.使用函数排序
    {

        // 产生随机数
        NSMutableArray *unsortDataM = [NSMutableArray array];
        for (NSInteger index = 0; index < 20; index++) {
            int random = arc4random()%20;
            [unsortDataM addObject:@(random)];
        }
        NSLog(@"使用函数排序前的数据:%@",unsortDataM);
        NSArray  *sortedData = [unsortDataM sortedArrayUsingFunction:customSort context:nil];
        NSLog(@"使用函数排序后的数据:%@",sortedData);
    }
#pragma mark - 排序函数

NSInteger customSort(id obj1, id obj2,void* context) {
    int value1 = (int)obj1;
    int value2 = (int)obj2;

    if (value1 < value2) {
        return (NSComparisonResult)NSOrderedAscending;
    }

    if (value1 > value2) {
        return (NSComparisonResult)NSOrderedDescending;
    }

    return (NSComparisonResult)NSOrderedSame;
}

demo地址:https://github.com/HZChenCheng/SortArray

时间: 2024-11-05 11:50:12

数组的几种排序方式的相关文章

数组的三种声明方式总结、多维数组的遍历、Arrays类的常用方法总结

1. 数组的三种声明方式 public class WhatEver { public static void main(String[] args) { //第一种 例: String[] test1 = new String[6]; test1[0] = "数组0"; test1[1] = "数组1"; //第二种 例: String[] test2 = {"数组0","数组1","数组2","

sort_contours_xld算子的几种排序方式研究

sort_contours_xld算子有5种排序方式,即: 'upper_left': The position is determined by the upper left corner of the surrounding rectangle. 'upper_right':The position is determined by the upper right corner of the surrounding rectangle. 'lower_left':The position i

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

数组的三种定义方式

// 数组的三种定义方式 var arr = ['zhangsan','lisi','wangwu']; var arr1 = new Array('zhangsan','lisi','wangwu'); var arr2 = new Array(3); arr2[0] = 'zhangsan'; //注意:下标一定要写,不像在php中,下标是可以不写,是一直追加 // console.log(arr2); // 说明:js中,没有关联数组一说,数组下标都是数字 // 如果一个数组的下标是自定义

HashMap的两种排序方式

Map<String, Integer> map = new HashMap<String, Integer>(); map.put("d", 2); map.put("c", 1); map.put("b", 1); map.put("a", 3); List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.

一维数组的两种访问方式

一维数组指针,int *prt=new int[10],*ptr和ptr[0]是一样的吗? 通过下面代码测试: int * array = new int[10]; for(int i=0;i<10;i++) { array[i] = i; } for(int i=0;i<10;i++) { cout<<*(array+i)<<endl; } 所以数组可以用 array[i]和 *(array+i)两种方式访问. 一维数组的两种访问方式

JAVA中运用数组的四种排序方法

JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来. 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组. 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序.下面我就将他们的实现方法一一详解供大家参考. <1>利用Arrays带有的排序方法快

JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)

每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名思义,就是小数往上冒,大数往下沉.从第一个数开始,如果比第二个数大就交换位置,然后跟第三个数字进行比较大小,交换位置等. 举例一下,有数组[2,4,3,5,1] 第一次循环:2<4  不交换:4>3 交换:4<5不交换:5>1交换,故结果是[2,3,4,1,5]; 第二次循环:2<

字符串数组的两种定义方式

C++实现字符串数组的两种方式 1.常用的方法 #include <iostream> #include <string> using namespace std; int main() { string str[]={"hello", "string", "world"}; int str_size=sizeof(str)/sizeof(string); cout<<"size of str is