将对象按照时间戳排序,这里典型的一个例子是登录账户的排序:本地客户端可能保存了多个账户信息,在登录窗口用户可以选择已经登陆过的账户直接登录,现在的需求是要时刻让最近登陆过的账户排在前面,对于每个账户,每次登陆时都记录下当前登陆的时间,时间是一个时间戳(从1970年到现在的秒数)。我们要做的是将时间戳排序,然后按照时间戳的顺序将所有账户排序。当然这也适用于其他关于时间排序的问题。


实现思路和过程

  • 1.先将每个账户对象的时间戳变量(要足够精确,采用long long int)取出来:一方面要将每个时间戳转换成NSDate对象用于排序;另一方面要将每一个时间戳转换成一个字符串作为key和对应的账户对象放入字典中做成一个哈希表,用于之后根据排序好的时间戳将账户对象数组排序。

    排序过程需要一个数组用于时间排序的NSDate对象,一个字典作为存放‘时间戳-对象’的哈希表:

    // 时间戳数组(存放时间NSDate对象用于排序)NSMutableArray *timeArr = [[NSMutableArray alloc]init];// 时间戳-对象字典,将对象和其对应的时间戳字符串存入字典(哈希表)NSMutableDictionary *dateKeyArr = [[NSMutableDictionary alloc]init];// 时间戳取出,并格式化处理for(Account *acc in _accountArray) {// 1.时间戳转成时间对象用于排序NSDate  *date = [NSDate dateWithTimeIntervalSince1970:acc.loginTime];[timeArr addObject:date];// 2.时间戳转成时间戳字符串作为key,制作哈希表NSNumber *dataNum = [NSNumber numberWithLongLong:acc.loginTime];NSString *datekey = [dataNum stringValue];[dateKeyArr setObject:acc forKey:datekey];}
  • 2.将取出的NSDate对象数组排序
    // 3.将时间NSDate数组排序NSArray *orderedDateArray = [timeArr sortedArrayUsingComparator:^NSComparisonResult(NSDate *date1, NSDate *date2) {// 降序排序,最近的时间靠前return [date2 compare:date1];}];
  • 3.按照排序好的时间数组,安排好的顺序将对象从哈希表一次取出得到排序好的对象数组:
    // 根据排序好的时间数组对号入座将对象按时间排序// 临时数组,保存排序后的对象数组NSMutableArray *sortedAccounts = [[NSMutableArray alloc]init];NSDate *datekey = [[NSDate alloc]init];for (int i = 0; i<orderedDateArray.count; i++) {datekey = orderedDateArray[i];// 日期对象转换成时间戳字符串keyNSString *datekeys = [NSString stringWithFormat:@"%lld", (long long)[datekey timeIntervalSince1970]];// 根据时间戳字符串key取对应的对象(哈希表)[sortedAccounts addObject:[dateKeyArr objectForKey:datekeys]];}// sortedAccounts就是我们要的结果了

完整的示例Demo

这里制作一个只包含用户名和时间戳的假账户数据,排序后按照顺序显示在一个textview中:

账户Account

//
//  Account.h
//  TimeSortDemo
//
//  Created by Xinhou Jiang on 22/12/16.
//  Copyright © 2016年 Xinhou Jiang. All rights reserved.
//#import <Foundation/Foundation.h>@interface Account : NSObject@property (nonatomic, copy) NSString *name;              // 姓名
@property (nonatomic, assign) long long int loginTime;   // 上次登录时间戳(距离1970年的秒数)+ (Account*)newAccountWithName:(NSString *)name andTime:(long long int)logintime;@end
//
//  Account.m
//  TimeSortDemo
//
//  Created by Xinhou Jiang on 22/12/16.
//  Copyright © 2016年 Xinhou Jiang. All rights reserved.
//#import "Account.h"@implementation Account+ (Account *)newAccountWithName:(NSString *)name andTime:(long long)logintime {Account *acc = [[Account alloc] init];acc.name = name;acc.loginTime = logintime;return acc;
}@end

UIViewController

//
//  ViewController.m
//  TimeSortDemo
//
//  Created by Xinhou Jiang on 22/12/16.
//  Copyright © 2016年 Xinhou Jiang. All rights reserved.
//#import "ViewController.h"
#import "Account.h"@interface ViewController ()@property(nonatomic, strong) IBOutlet UITextView *text;@property (nonatomic, strong) NSMutableArray<Account*> *accountArray; // 账户数组@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 请求数据[self request];// 排序前[self showUI];}- (void) request {// 初始化数组并添加几个账户假数据对象_accountArray = [[NSMutableArray alloc] init];[_accountArray addObject:[Account newAccountWithName:@"张三" andTime:1450675000]];[_accountArray addObject:[Account newAccountWithName:@"李四" andTime:1450923000]];[_accountArray addObject:[Account newAccountWithName:@"小明" andTime:1450656000]];[_accountArray addObject:[Account newAccountWithName:@"小丽" andTime:1450435000]];
}// 将数组按照时间戳排序
- (IBAction)sort:(id)sender {/** 按照时间戳排序 **/// 1.初始化// 时间戳数组(存放时间NSDate对象用于排序)NSMutableArray *timeArr = [[NSMutableArray alloc]init];// 时间戳-对象字典,将对象和其对应的时间戳字符串存入字典(哈希表)NSMutableDictionary *dateKeyArr = [[NSMutableDictionary alloc]init];// 2.时间戳取出,并格式化处理for(Account *acc in _accountArray) {// 时间戳转成时间对象用于排序NSDate  *date = [NSDate dateWithTimeIntervalSince1970:acc.loginTime];[timeArr addObject:date];// 时间戳转成时间戳字符串作为key,制作哈希表NSNumber *dataNum = [NSNumber numberWithLongLong:acc.loginTime];NSString *datekey = [dataNum stringValue];[dateKeyArr setObject:acc forKey:datekey];}// 3.将时间NSDate数组排序NSArray *orderedDateArray = [timeArr sortedArrayUsingComparator:^NSComparisonResult(NSDate *date1, NSDate *date2) {// 降序排序,最近的时间靠前return [date2 compare:date1];}];// 4.根据排序好的时间数组对号入座将对象按时间排序// 临时数组,保存排序后的对象数组NSMutableArray *sortedAccounts = [[NSMutableArray alloc]init];NSDate *datekey = [[NSDate alloc]init];for (int i = 0; i<orderedDateArray.count; i++) {datekey = orderedDateArray[i];// 日期对象转换成时间戳字符串keyNSString *datekeys = [NSString stringWithFormat:@"%lld", (long long)[datekey timeIntervalSince1970]];// 根据时间戳字符串key取对应的对象(哈希表)[sortedAccounts addObject:[dateKeyArr objectForKey:datekeys]];}// 5.更新排序后的对象数组[ARC中不需要手动释放排序前的数组]_accountArray = sortedAccounts;// 显示排序后的数据[self showUI];
}// 显示数据到页面
- (void) showUI {NSString *s = [NSString stringWithFormat:@"%@[%lld]\n%@[%lld]\n%@[%lld]\n%@[%lld]",_accountArray[0].name,_accountArray[0].loginTime,_accountArray[1].name,_accountArray[1].loginTime,_accountArray[2].name,_accountArray[2].loginTime,_accountArray[3].name,_accountArray[3].loginTime];_text.text = s;
}@end

Github Demo:https://github.com/jiangxh1992/TimeSortDemo

【Demo】IOS中将对象数组按照时间戳排序相关推荐

  1. java list数组排序_浅谈对象数组或list排序及Collections排序原理

    常需要对list进行排序,小到List,大到对自定义的类进行排序.不需要自行归并或堆排序.简单实现一个接口即可. 本文先会介绍利用Collections对List进行排序,继而讲到Collection ...

  2. 对象数组转成字符串数组 java_如何在Java中将对象数组转换为字符串数组

    如何在Java中将对象数组转换为字符串数组 我使用以下代码将Object数组转换为String数组: Object Object_Array[]=new Object[100]; // ... get ...

  3. JavaScript中将对象按照某个属性排序

    一直没弄明白 a[value]这种访问对象属性的方式--今天懂了 可以通过点语法来存取,比如obj.name指的是访问obj对象上的name属性,但是此时对象上要有这个name属性,否则访问到的就是u ...

  4. IOS中将对象属性列表归档成一个plist文件中

    归档步骤: 1.将一个NSDictionary对象归档到一个plist属性列表中 <1> 首先要将数据封装成字典: NSMutableDictionary * dict = [NSMuta ...

  5. java解析vue对象数组,Java数组

    Java提供了一个数据结构,所述数组,其存储相同类型的元件的固定大小的连续集合.数组用于存储数据集合,但将数组视为相同类型变量的集合通常更为有用. 您可以声明一个数组变量,例如数字和数字[0],数字[ ...

  6. iOS开发之谓词Predicate和对象数组的排序

    我们在开发中经常使用的Predicate谓词,主要是正则表达式的使用,今天给大家简单的讲讲怎样去使用谓词. 因为内容比较简单,所以直接上代码展示: NSMutableArray *people_arr ...

  7. 根据数组中对象的属性值排序倒叙

    数组中对象的属性值排序倒叙demo function compare(e) {return function (a, b) {var value1 = a[e];var value2 = b[e];r ...

  8. js数组对象按照中文拼音排序

    今天遇到一个需求如图所示,下拉框按照中文拼音排序,而我们下拉框给的都是接口传过来的对象,所以要想排序,还是稍微需要处理一下的 话不多说,我们先看一个demo,根据这个demo,我们就能完成,我们想要的 ...

  9. javascript数组之数组排序:数组按照字符顺序排序,反转数组,数字排序,比值函数,随机排序,查找最大最小数组值,自制找数组最高最低值办法,排序对象数组

    1.数组排序 sort() sort() 方法以字母顺序对数组进行排序 var fruits = ["Banana", "Orange", "Appl ...

最新文章

  1. windows 7使用CAJViewer时出错显示缺少ReaderEX.dll处理
  2. imu oracle,问一个关于IMU REDO的问题~
  3. 【RPC服务器不可用】解决方法
  4. Coursera课程Python for everyone:Quiz: Multi-Table Relational SQL
  5. (原创)无废话C#设计模式之十一:Composite
  6. STL算法学习[转]
  7. php mysql 胚子_php mysql数据库连接浅识
  8. 游戏开发中常用的设计模式
  9. 9-14 ruby环境准备 操作
  10. 计算机网络重点知识总结 谢希仁版,计算机网络谢希仁版网络层知识点总结
  11. python 可控制深度遍历文件夹
  12. C语言程序设计--宏和预处理
  13. 2020PayPal提现有哪些渠道?听说注册义乌个体户也可以!
  14. prepareStatement的批量处理数据
  15. c语言案例六 速算24,参阅:C语言速算24数据结构课程设计最终版
  16. 给你一个二维整数数组 matrix,返回 matrix 的 转置矩阵
  17. postfix邮件服务器迁移,记一次搭建Postfix邮件服务器(上篇)
  18. 如何认识和投身 Web 3.0?
  19. 本地.m3u8播放器实现
  20. 中北大学算法分析与设计实验报告一(BF算法)

热门文章

  1. 如何2小时速通高等数学
  2. 四句话解决const赋值问题
  3. 麓言科技产品设计高级色彩搭配
  4. 《项目经理手记》读书笔记
  5. tripwire检查文件完整性
  6. 开发游戏,我该使用何种语言
  7. Java面向对象 - 封装、继承和多态
  8. 智能图书管理系统V2.0-完整版
  9. 手机照片积压过万,如何用便捷的方式去整理和再度呈现?
  10. Vue项目SEO优化之预渲染--prerender-spa-plugin 搭配vue-meta-info