数组内部对象排序(sort)
1.数组排序有很多方法比如for,while循环去进行冒泡排序或者快速看、排序等多种排序方法
而我在这里要说的是苹果API提供的几个系统方法
a.迭代器 Descriptor
b.方法比较 Selector
c.函数比较 Function
d.块代码 Block自定义
2.示例
1.1一个要比较对象的类(Person)
@interface Person : NSObject @property(nonatomic , copy)NSString * name; @property(nonatomic , copy)NSString * phone; @property(nonatomic , assign)int age; @end
1.2自定义几个Person对象(在其他类中)
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可以很方便的进行多条件排序
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这个方法时内部会进行相应的比较排序
Person.h
- (NSComparisonResult)compareAgeAscende:(id)other;
Person.m
- (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
ViewController (- (void)viewDidLoad)
NSArray *modifyArray2 = [originalArray sortedArrayUsingSelector:@selector(compareAgeAscende:)];
NSLog(@"modifyArray2 : %@",modifyArray2);
注: a.当数组里面对象是NSString时可以用compare:进行sel比较
1.3.3 函数比较 该函数是一个比较函数(C语言),该函数同样是放回NSComparisonResult这个枚举,其实就是一个NSInteger的整数,然后NSArray调用sortedArrayUsingFunction这个方法时内部会进行相应的比较排序
// 定义在viewController里面(其实定义在哪里无所谓,主要是可以调用到就行)
NSInteger personSort(id obj1,id obj2 ,void * context){
Person *person1 = (Person *)obj1;
Person *person2 = (Person *)obj2;
return [person1.name localizedCompare:person2.name];
}
NSArray *modifyArray3 = [originalArray sortedArrayUsingFunction:personSort context:NULL];
NSLog(@"modifyArray3 : %@",modifyArray3);
1.3.4 block比较 该block里面定义写一个比较的代码块,该代码块同样返回NSComparisonResult这个枚举
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 字符串(带汉字)转拼音字符串 (为了上面的比较问题,为了更多需求)
- (NSString *) phonetic:(NSString*)sourceString {
NSMutableString *source = [sourceString mutableCopy];
CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformMandarinLatin, NO);
CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformStripDiacritics, NO);
return source;
}
//汉字转拼音后会以空格隔开
数组内部对象排序(sort)的更多相关文章
- Array 数组的排序 sort
JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序.sort() 方法用于对数组的元素进行排序.语法如下:arrayObject.sort(s ...
- JavaScript中数组的排序——sort()
数组排序sort() sort()方法使数组中的元素按照一定的顺序排列. arrayObject.sort(方法函数) 1.如果不指定<方法函数>,则按unicode码顺序排列. 2.如果 ...
- ruby 数组array 排序sort 和sort!
1. sort → new_ary click to toggle source sort { |a, b| block } → new_ary Returns a new array created ...
- JavaScript 使用 sort() 方法从数值上对数组进行排序
使用 sort() 方法从数值上对数组进行排序. <html> <body> <script type="text/javascript"> f ...
- js中的数组对象排序(方法sort()详细介绍)
定义和用法 sort() 方法用于对数组的元素进行排序. 语法 arrayObject.sort(sortby) 参数sortby:可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意 ...
- Javascript数组系列四之数组的转换与排序Sort方法
今天我们继续来介绍 Javascirpt 数组中的方法,也是数组系列的第四篇文章,因为数组的方法众多,每篇文章我们都对数组的每个方法都有比较细致的描述,只要你能够从中成长一点点,那我们的目的就达到了, ...
- 数组升序排序的方法Arrays.sort();的应用
package com.Summer_0421.cn; import java.util.Arrays; /** * @author Summer * 数组升序排序的方法Arrays.sort();应 ...
- 对象数组自定义排序--System.Collections.ArrayList.Sort()
使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...
- js运用sort对json 数组进行排序
Array.sort()方法是用来对数组项进行排序的 ,默认情况下是进行升序排列.sort() 方法可以接受一个 方法为参数. sort()排序时每次比较两个数组项都回执行这个参数,并把两个比较的数组 ...
随机推荐
- [转]C#如何把文件夹压缩打包然后下载
public partial class _Default2 : System.Web.UI.Page{ protected void Page_Load(object sender, EventAr ...
- VMware Fusion DHCP方式下如何指定虚拟机IP地址
默认情况下,vmware fusion中的虚拟机,网卡设置成dhcp(动态分配 )时,会分配一个IP地址,但这个IP通常很难记,如果我们想为某台虚拟机挑一个好记的IP地址,可以按如下步骤操作: 命令行 ...
- [转]论acm与泡妞
abstract :本文从各个方面讨论了泡妞与做题之间的相似之处与不同点,尽量的站在一个公平的角度阐述这一问题,所得的研究成果填补了国内外的理论空白. - 泡了一个好妞就好像做了一道难题一样快感都是相 ...
- Oracle 11g 7个压缩包说明
最初,我以为都要解压.无意间看到的一博客,明白压缩包的含义.哈哈 Oracle11g有多张安装光盘: 文件名称 ...
- 41-tr 简明笔记
替换指定的字符 tr [options] string1 string2 参数 tr通常带有两个参数:string1 和 string2 ,当tr发现与string1中有匹配的字符时,它将使用stri ...
- 腾讯云CentOS 安装MediaWiki
参考 : https://www.digitalocean.com/community/tutorials/how-to-install-mediawiki-on-centos-7 //安装好很多次终 ...
- ASP.NET杂谈-一切都从web.config说起(2)(ConfigSections详解-下)
还是接着上一篇说起,在上两篇中主要和大家探讨了ConfigSection的几种常用形式,并举例几个例子说明了一下.其实它们主要都是继承System.Configuration.Configuratio ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- java-a实现压缩与解压缩(zip、gzip)
zip扮演着归档和压缩两个角色:gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩. Java I/O类库还 ...
- quartz启动时间配置
这些星号由左到右按顺序代表 : * * * * * * * 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , ...