iOS--自定义相册---对象数组按照时间戳排序
将对象按照时间戳排序,这里典型的一个例子是登录账户的排序:本地客户端可能保存了多个账户信息,在登录窗口用户可以选择已经登陆过的账户直接登录,现在的需求是要时刻让最近登陆过的账户排在前面,对于每个账户,每次登陆时都记录下当前登陆的时间,时间是一个时间戳(从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--自定义相册---对象数组按照时间戳排序的更多相关文章
- js对象数组多字段排序
来源:js对象数组按照多个字段进行排序 一.数组排序 Array.sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序. 一般用法:(数组元素从小大进行排序) var a = ...
- iOS 自定义的对象类型的解档和归档
自定义的对象的解档和归档 如果想对自己自定义的类进行解档和归档的话 必须遵循一个协议:NSCoding Student.h 文件 #import <Foundation/Foundation.h ...
- JS框架设计之对象数组化一种子模块
类数组对象是一个很好的存储结构,但是功能太弱了,为了享受纯数组的哪些便捷的方法,使用前可以做下转换,通常可以使用$.slice.call()方法做转换,但是旧版本的IE下的HTMLCollection ...
- JAVA(1)之关于对象数组作形参名的方法的使用
public class Test{ int tour; public static void cs(Test a[]) { for (int i = 0; i < a.length; i++) ...
- iOS探索:对NSArray中自定义的对象进行排序
http://mobile.51cto.com/hot-434804.htm 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天 ...
- iOS数组排序 请求后,数组元素的排序 时间戳,最热,点赞数等
[ZOYSessionManager dataWithUrlString:GetVideoDataComment andParameter:@{@"id":userID,@&quo ...
- iOS开发之谓词Predicate和对象数组的排序
我们在开发中经常使用的Predicate谓词,主要是正则表达式的使用,今天给大家简单的讲讲怎样去使用谓词. 因为内容比较简单,所以直接上代码展示: NSMutableArray *people_arr ...
- 对象数组自定义排序--System.Collections.ArrayList.Sort()
使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...
- iOS中怎么存储照片到自定义相册
在市场上主流App中,大多数App都具有存储图片到自己App的相册中.苹果提供的方法只能存储图片到系统相册,下面讲一下怎么实现: 实现思路: 1.对系统相册进行操作的前提必须导入#import &l ...
随机推荐
- 使 windows 无需输入开机密码自动进入系统
步骤 运行netplwiz: 勾去图中所示复选框,确定后输入密码.
- cookie和session是否可以保存对象
session看了一下,是可以保存对象的.语法很普通,但是cookie的话本身是只能保存string类型的信息的,这就需要先序列化,然后接收的页面反序列化后形成对象调用,为了防止乱码,需要在数据传输的 ...
- 多并发下 SimpleDateFormat 出现错误
private static String time = "2019-01-11 11:11:11"; private static long timestamp = 154717 ...
- 2018.4.22 深入理解Java的接口和抽象类
前言 对于面向对象编程来说,抽象是他的一大特征之一.在Java中,可以通过两种形式来体现oop 的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初雪的时候会以为他们可以随意互 ...
- stixel world论文总结
1.The Stixel World - A Compact Medium Level Representation of the 3D-World:http://pdfs.semanticschol ...
- Bootstrap 下拉菜单(dropdown)插件
使用下拉菜单的插件,您可以向任何组件(比如:导航栏,标签页,胶囊式导航,按钮)添加下拉菜单 用法 您可以切换下拉菜单(dropdown)插件隐藏内容 1.通过data属性,向链接或按钮添加data-t ...
- Java第十二次作业:继承与抽象类解决工人与学生的问题,抽象类实例。抽象类作用——为多态创造了可能。抽象类的作用总结
继承与抽象类解决工人与学生的问题 抽象类实例 package com.swift; public abstract class Person { private String name; privat ...
- iOS 绘制1像素的线
一.Point Vs Pixel iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮助我们处理Point到P ...
- Sorted Union-freecodecamp算法题目
Sorted Union 1.要求 写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组. 换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但 ...
- 201621123080《Java程序设计》第1周学习总结
作业01-Java基本概念 1. 本周学习总结 关键词: JDK.JAVA.编程.基础语法 概念之间的关系: JDK是JAVA的开发工具,学习JAVA的主要方法是大量编程,语法是JAVA的基础 2. ...