将对象按照时间戳排序,这里典型的一个例子是登录账户的排序:本地客户端可能保存了多个账户信息,在登录窗口用户可以选择已经登陆过的账户直接登录,现在的需求是要时刻让最近登陆过的账户排在前面,对于每个账户,每次登陆时都记录下当前登陆的时间,时间是一个时间戳(从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];
}];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 3.按照排序好的时间数组,安排好的顺序将对象从哈希表一次取出得到排序好的对象数组:
    // 根据排序好的时间数组对号入座将对象按时间排序
// 临时数组,保存排序后的对象数组
NSMutableArray *sortedAccounts = [[NSMutableArray alloc]init];
NSDate *datekey = [[NSDate alloc]init];
for (int i = 0; i<orderedDateArray.count; i++) {
datekey = orderedDateArray[i];
// 日期对象转换成时间戳字符串key
NSString *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];
// 日期对象转换成时间戳字符串key
NSString *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

iOS--自定义相册---对象数组按照时间戳排序的更多相关文章

  1. js对象数组多字段排序

    来源:js对象数组按照多个字段进行排序 一.数组排序 Array.sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序. 一般用法:(数组元素从小大进行排序) var a = ...

  2. iOS 自定义的对象类型的解档和归档

    自定义的对象的解档和归档 如果想对自己自定义的类进行解档和归档的话 必须遵循一个协议:NSCoding Student.h 文件 #import <Foundation/Foundation.h ...

  3. JS框架设计之对象数组化一种子模块

    类数组对象是一个很好的存储结构,但是功能太弱了,为了享受纯数组的哪些便捷的方法,使用前可以做下转换,通常可以使用$.slice.call()方法做转换,但是旧版本的IE下的HTMLCollection ...

  4. JAVA(1)之关于对象数组作形参名的方法的使用

    public class Test{ int tour; public static void cs(Test a[]) { for (int i = 0; i < a.length; i++) ...

  5. iOS探索:对NSArray中自定义的对象进行排序

    http://mobile.51cto.com/hot-434804.htm 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天 ...

  6. iOS数组排序 请求后,数组元素的排序 时间戳,最热,点赞数等

    [ZOYSessionManager dataWithUrlString:GetVideoDataComment andParameter:@{@"id":userID,@&quo ...

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

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

  8. 对象数组自定义排序--System.Collections.ArrayList.Sort()

    使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...

  9. iOS中怎么存储照片到自定义相册

    在市场上主流App中,大多数App都具有存储图片到自己App的相册中.苹果提供的方法只能存储图片到系统相册,下面讲一下怎么实现: 实现思路:  1.对系统相册进行操作的前提必须导入#import &l ...

随机推荐

  1. mini_batch GD

    工作过程:训练总样本个数是固定的,batch_size大小也是固定的,但组成一个mini_batch的样本可以从总样本中随机选择.将mini_batch中每个样本都经过前向传播和反向传播,求出每个样本 ...

  2. leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal,剑指offer 6 重建二叉树

    不用迭代器的代码 class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<in ...

  3. 重新postgresql出现错误:Problem running post-install step. Installation may not complete correctly. The database cluster initialisation failed.

    以前正常使用的postgresql,今天出现问题:报*.dll错误.百度了一下,只能重新安装 . 在重新安装过程中报:Problem running post-install step. Instal ...

  4. js中读取解析json数据

    在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键. JSON字符串:       'var str1 = ' ...

  5. Visual Studio Professional 2015 简体中文专业版 序列号

    Visual Studio Professional 2015 简体中文专业版 专业版激活密钥:HMGNV-WCYXV-X7G9W-YCX63-B98R2 Visual Studio Enterpri ...

  6. javaweb基础(24)_jsp一般的标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  7. 关于flyme5显示不到和卸载不到旧应用解决方法

    笔者买入一台mx5,升级flyme5后旧应用没有显示出来,而且在设置的应用管理都没显示旧应用. 通过adb命令: adb shell pm list packages显示所有包名, 查看自己要删除应用 ...

  8. Xcode中的Project和Target

    新创建工程(如下图e.g.),APP的属性包括了 PROJECT 和 TARGETS 两块内容.且一个工程只有一个 PROJECT,但可以有一个或多个 TARGETS(从苹果的命名上也可以看出,这个 ...

  9. JavaScript中面向对象的三大特性(一个菜鸟的不正经日常)

    经过几天的学习,把jQuery给啃会了,但是运用的还不算特别熟练,总感觉自己在JavaScript方面的基础十分欠缺,所以继续拾起JavaScript,开始更好的编程之旅~ 今天学的是JavaScri ...

  10. PostgreSQL学习(2)-- mvcc

    1.PG事务隔离级别 在数据库中,并发的操作进行读写数据时,则会遇到脏读.不可重复读.幻读.串行化异常等问题. 数据库事务的特性: 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对 ...