数组内部对象排序(sort)

1.数组排序有很多方法比如for,while循环去进行冒泡排序或者快速看、排序等多种排序方法

而我在这里要说的是苹果API提供的几个系统方法

a.迭代器     Descriptor

b.方法比较  Selector

c.函数比较  Function

d.块代码    Block自定义

2.示例

1.1一个要比较对象的类(Person)


1

2

3

4

5

6

7

8

9

@interface Person : NSObject

@property(nonatomic copy)NSString * name;

@property(nonatomic copy)NSString * phone;

@property(nonatomic , assign)int age;

@end

1.2自定义几个Person对象(在其他类中)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Person *person1 = [[Person alloc] init];

person1.name = @"gulong";

person1.age = 23;

Person *person2 = [[Person alloc] init];

person2.name = @"guzheng";

person2.age = 24;

Person *person3 = [[Person alloc] init];

person3.name = @"zhangsan";

person3.age = 21;

Person *person4 = [[Person alloc] init];

person4.name = @"lisi";

person4.age = 25;

NSArray *originalArray = @[person1,person2,person3,person4];

1.3排序开始

1.3.1 使用迭代器进行排序

使用NSSortDescriptor可以很方便的进行多条件排序


1

2

3

NSSortDescriptor *sorter1 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

NSSortDescriptor *sorter2 = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:NO];

NSArray *modifyArray1 = [originalArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sorter1,sorter2,nil]];

//首先通过name的字母进行升序排序,然后进行age大小比较进行降序排序

//数组通过sortedArrayUsingDescriptors可以进行多重排序(就是相等时就进行下一个比较迭代器)

    1.3.2 使用SEL方法排序

       首先需要在对象类里面定义并且在实现类里面实现这一方法(OC方法),该方法返回一个NSComparisonResult的枚举值(其实就是-1,0,1),然后NSArray调用sortedArrayUsingSelector这个方法时内部会进行相应的比较排序


1

Person.h<br>- (NSComparisonResult)compareAgeAscende:(id)other;


1

2

3

4

5

6

7

8

9

10

11

12

13

Person.m<br>- (NSComparisonResult)compareAgeAscende:(id)other

{

    Person *otherPerson = (Person *)other;

    if (self.age > otherPerson.age) {

        return NSOrderedDescending;

    }else{

        if (self.age == otherPerson.age) {

            return NSOrderedSame;

        }else{

            return NSOrderedAscending;

        }

    }

}

下面是调用 sortedArrayUsingSelector


1

2

3

ViewController  (- (void)viewDidLoad)

  NSArray *modifyArray2 = [originalArray sortedArrayUsingSelector:@selector(compareAgeAscende:)];

  NSLog(@"modifyArray2 : %@",modifyArray2);

注: a.当数组里面对象是NSString时可以用compare:进行sel比较

1.3.3 函数比较  该函数是一个比较函数(C语言),该函数同样是放回NSComparisonResult这个枚举,其实就是一个NSInteger的整数,然后NSArray调用sortedArrayUsingFunction这个方法时内部会进行相应的比较排序    


1

2

3

4

5

6

// 定义在viewController里面(其实定义在哪里无所谓,主要是可以调用到就行)

NSInteger personSort(id obj1,id obj2 ,void * context){

    Person *person1 = (Person *)obj1;

    Person *person2 = (Person *)obj2;

    return [person1.name localizedCompare:person2.name];

}


1

2

NSArray *modifyArray3 = [originalArray sortedArrayUsingFunction:personSort context:NULL];

    NSLog(@"modifyArray3 : %@",modifyArray3);

1.3.4 block比较 该block里面定义写一个比较的代码块,该代码块同样返回NSComparisonResult这个枚举


1

2

3

4

5

6

7

8

9

10

11

12

NSArray *modifyArray4 = [originalArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

        Person *pers1 = (Person *)obj1;

        Person *pers2 = (Person *)obj2;

        if (pers1.age > pers2.age) {

            return NSOrderedDescending;

        }else if (pers1.age < pers2.age){

            return NSOrderedAscending;

        }else{

            return NSOrderedSame;

        }

    }];

    NSLog(@"modifyArray4 : %@",modifyArray4);

   1.4 字符串(带汉字)转拼音字符串 (为了上面的比较问题,为了更多需求)


1

2

3

4

5

6

- (NSString *) phonetic:(NSString*)sourceString {

    NSMutableString *source = [sourceString mutableCopy];

    CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformMandarinLatin, NO);

    CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformStripDiacritics, NO);

    return source;

}<br>  //汉字转拼音后会以空格隔开

时间: 2024-12-20 06:41:34

数组内部对象排序(sort)的相关文章

js数组的排序——sort()

对于一个数组的排序,默认的sort()按字符编码排序的: var testArray=[3,324,5345,6546,134,5654,665]; testArray.sort(); alert(testArray); 输出结果是:134  3  324  5345  5654  6546  665 现在要让它按照数值大小排序: var testArray=[3,324,5345,6546,134,5654,665]; testArray.sort(function(a,b){return a

二维数组的排序

1 result =[['7250','1'],['7510','2'],['7759','0'],['6523','33']] 2 3 copy_result = [] 4 5 for item in result: 6 copy_result.append([int(item[0]),item[1]]) 7 8 print result 9 # output: 10 # [['7250', '1'], ['7510', '2'], ['7759', '0'], ['6523', '33']]

Java使用sort()方法对数组进行排序

1 package com.yzy.test; 2 3 import java.util.Arrays; 4 5 public class Test { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 int[] array = { 43, 64, 21, 6565, 3424, 22, 6523, 345 }; 12 Arrays.sort(array); 13 for (int i : a

JS数组去重,js中数组(Array)的排序(sort)

JS数组去重 var ddd = [1,2,4,5,2, 222,1,5,6]; var uq = {}; var rq = []; for(var i=0; i<9; i++){ if(!uq[ddd[i]]){ uq[ddd[i]] = true; rq.push(ddd[i]); } } return rq; js中数组(Array)的排序(sort)注意事项 var arrDemo = new Array(); arrDemo[0] = 10; arrDemo[1] = 50; arrD

JavaScript 使用 sort() 方法从数值上对数组进行排序

使用 sort() 方法从数值上对数组进行排序. <html> <body> <script type="text/javascript"> function sortNumber(a, b) { return a - b } var arr = new Array(6) arr[0] = "10" arr[1] = "5" arr[2] = "40" arr[3] = "25&q

js中的数组对象排序(方法sort()详细介绍)

定义和用法 sort() 方法用于对数组的元素进行排序. 语法    arrayObject.sort(sortby) 参数sortby:可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 普通数组排序: js中用方法sort()为数组排序.sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: 字母A.B的ASCII值分别为65.66,而a.b的值分别为97.98,所

Javascript数组系列四之数组的转换与排序Sort方法

今天我们继续来介绍 Javascirpt 数组中的方法,也是数组系列的第四篇文章,因为数组的方法众多,每篇文章我们都对数组的每个方法都有比较细致的描述,只要你能够从中成长一点点,那我们的目的就达到了,学习是一个持续的,渐进的过程.每天进步一点点,最终会有大成就. 直接进入主题 数组的转换 我们在项目的开发过程中,数据类型之间的转换有着非常重要的作用,而数组转换成其他数据类型是我们常见的一种. toString 该方法是对数组转换成字符串,数组的每一个元素都会调用 「toString」方法 ,返回

给object数组进行排序(排序条件是每个元素对象的属性个数)

从汤姆大叔的博客里看到了6个基础题目:本篇是第3题 - 给object数组进行排序(排序条件是每个元素对象的属性个数) 解题关键: 1.Array.sort的用法 2.object的属性数量的统计 解点1:Array.sort的用法 Array.sort可以为数组指定一个排序规则,一般用如下格式进行指定,代码如下: var arr = [10,6,0,4]; console.log( arr.sort() ); //按字符排序 0,10,4,6 console.log( arr.sort( fu

js中的数组对象排序

一.普通数组排序 js中用方法sort()为数组排序.sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: var arr = ["a", "b", "A", "B"]; arr.sort(); console.log(arr);//["A", "B", "a", "b"