如何对包含日期对象的自定义数组进行排序
How to sort Custom array which contains date object
我有一个 NSArray,其中包含这样的自定义对象:
NSArray *array = {
students,students
}
Student 对象依次存储如下值:
student.name,
student.class,
student.admissionDate
student.school ..etc
现在我想要一个 NSArray
,其中包含根据 admissionDate
排序的所有学生的详细信息。
我尝试使用 NSSortDecriptor
但它对我没有帮助。
编辑
经过一些努力,我成功地形成了一个 NSDictionary 的 NSMutable 数组,它看起来像:
for(Student *arr in array)
{
NSMutableDictionary *dict;
dict = [[NSMutableDictionary alloc]init];
[dict setObject:arr.stuName forKey:@"name"];
[dict setObject:arr.stuAdate forKey:@"date"];
[dict setObject:arr.stuClass forKey:@"class"];
[expenseArray addObject:dict];
}
Printing description of expenseArray:
<__NSArrayM 0x7fe703833f70>(
{
name = uuu;
Adate = "2015-10-10 10:56:03 +0000";
class = 1st;
},
{
name = abc;
Adate = "2015-10-07 11:10:00 +0000";
class = 3rd;
},
{
name = btw;
Adate = "2015-10-10 11:13:47 +0000";
class = 4th;
}
)
现在如何根据日期排序
排序描述符应该可以正常工作
NSSortDescriptor *admissionSort = [NSSortDescriptor sortDescriptorWithKey:@"Adate" ascending:NO];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[admissionSort]];
将根据入院日期对数组进行排序,假设它实际上是一个 NSDate
值。
排序描述符应该适合您
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"admissionDate" ascending:YES];
NSArray *sortedStudents = [studentArray sortedArrayUsingDescriptors:@[sortDescriptor]];
下面是工作示例
NSMutableArray *studentArray = [NSMutableArray new];
for (int i = 0; i < 8; i++) {
Student *student = [Student new];
unsigned int randomInterval = arc4random();
student.admissionDate = [NSDate dateWithTimeIntervalSinceNow:randomInterval];
[studentArray addObject:student];
}
for (Student *student in studentArray) {
NSLog(@"%@", student.admissionDate);
}
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"admissionDate" ascending:YES];
NSArray *sortedStudents = [studentArray sortedArrayUsingDescriptors:@[sortDescriptor]];
NSLog(@"\n\n * * * * * After Sorting * * * * * *\n\n");
for (Student *student in sortedStudents) {
NSLog(@"%@", student.admissionDate);
}
日志
2024-02-11 23:47:47 +0000
2093-11-13 21:49:48 +0000
2042-04-06 23:53:28 +0000
2032-12-23 01:49:46 +0000
2102-12-28 23:08:06 +0000
2058-10-17 14:14:27 +0000
2142-02-01 07:19:34 +0000
2048-05-14 07:07:04 +0000
* * * * * After Sorting * * * * * *
2024-02-11 23:47:47 +0000
2032-12-23 01:49:46 +0000
2042-04-06 23:53:28 +0000
2048-05-14 07:07:04 +0000
2058-10-17 14:14:27 +0000
2093-11-13 21:49:48 +0000
2102-12-28 23:08:06 +0000
2142-02-01 07:19:34 +0000
虽然 NSSortDescription
似乎是对数组进行排序的最佳方法,但这里是替代方法:
NSArray *studentsArray = @[someStudent1, someStudent2];
NSArray *sortedStudentsArray = [studentsArray sortedArrayUsingComparator:^NSComparisonResult(Student *student1, Student *student2) {
return [student1.admissionDate compare:student2.admissionDate];
}];
NSSortDescriptor 工作正常!
您应该将可变字典替换为 Student class。
@interface Student : NSObject
@property NSString *name;
@property NSString *className;
@property NSString *schoolName;
@property NSDate *admissionDate;
@end
@implementation Student
@end
这个class的用途
Student *student1 = [[Student alloc] init];
student1.name = @"Name a";
student1.className = @"4th";
student1.schoolName = @"XYZ High school";
student1.admissionDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24]; // 60 * 60 * 24 one day time interval in second
Student *student2 = [[Student alloc] init];
student2.name = @"Name b";
student2.className = @"5th";
student2.schoolName = @"XYZ High school";
student2.admissionDate = [NSDate date]; // current date
NSArray *array = [NSArray arrayWithObjects:student1,student2, nil];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"admissionDate" ascending:YES];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[descriptor]];
for (Student *student in sortedArray) {
NSLog(@"admissionDate %@", student.admissionDate);
}
请记住 [array sortedArrayUsingDescriptors:@[descriptor]] return 排序数组,而不是重新排列数组元素本身。
希望这会奏效。
我有一个 NSArray,其中包含这样的自定义对象:
NSArray *array = {
students,students
}
Student 对象依次存储如下值:
student.name,
student.class,
student.admissionDate
student.school ..etc
现在我想要一个 NSArray
,其中包含根据 admissionDate
排序的所有学生的详细信息。
我尝试使用 NSSortDecriptor
但它对我没有帮助。
编辑
经过一些努力,我成功地形成了一个 NSDictionary 的 NSMutable 数组,它看起来像:
for(Student *arr in array)
{
NSMutableDictionary *dict;
dict = [[NSMutableDictionary alloc]init];
[dict setObject:arr.stuName forKey:@"name"];
[dict setObject:arr.stuAdate forKey:@"date"];
[dict setObject:arr.stuClass forKey:@"class"];
[expenseArray addObject:dict];
}
Printing description of expenseArray:
<__NSArrayM 0x7fe703833f70>(
{
name = uuu;
Adate = "2015-10-10 10:56:03 +0000";
class = 1st;
},
{
name = abc;
Adate = "2015-10-07 11:10:00 +0000";
class = 3rd;
},
{
name = btw;
Adate = "2015-10-10 11:13:47 +0000";
class = 4th;
}
)
现在如何根据日期排序
排序描述符应该可以正常工作
NSSortDescriptor *admissionSort = [NSSortDescriptor sortDescriptorWithKey:@"Adate" ascending:NO];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[admissionSort]];
将根据入院日期对数组进行排序,假设它实际上是一个 NSDate
值。
排序描述符应该适合您
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"admissionDate" ascending:YES];
NSArray *sortedStudents = [studentArray sortedArrayUsingDescriptors:@[sortDescriptor]];
下面是工作示例
NSMutableArray *studentArray = [NSMutableArray new];
for (int i = 0; i < 8; i++) {
Student *student = [Student new];
unsigned int randomInterval = arc4random();
student.admissionDate = [NSDate dateWithTimeIntervalSinceNow:randomInterval];
[studentArray addObject:student];
}
for (Student *student in studentArray) {
NSLog(@"%@", student.admissionDate);
}
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"admissionDate" ascending:YES];
NSArray *sortedStudents = [studentArray sortedArrayUsingDescriptors:@[sortDescriptor]];
NSLog(@"\n\n * * * * * After Sorting * * * * * *\n\n");
for (Student *student in sortedStudents) {
NSLog(@"%@", student.admissionDate);
}
日志
2024-02-11 23:47:47 +0000
2093-11-13 21:49:48 +0000
2042-04-06 23:53:28 +0000
2032-12-23 01:49:46 +0000
2102-12-28 23:08:06 +0000
2058-10-17 14:14:27 +0000
2142-02-01 07:19:34 +0000
2048-05-14 07:07:04 +0000
* * * * * After Sorting * * * * * *
2024-02-11 23:47:47 +0000
2032-12-23 01:49:46 +0000
2042-04-06 23:53:28 +0000
2048-05-14 07:07:04 +0000
2058-10-17 14:14:27 +0000
2093-11-13 21:49:48 +0000
2102-12-28 23:08:06 +0000
2142-02-01 07:19:34 +0000
虽然 NSSortDescription
似乎是对数组进行排序的最佳方法,但这里是替代方法:
NSArray *studentsArray = @[someStudent1, someStudent2];
NSArray *sortedStudentsArray = [studentsArray sortedArrayUsingComparator:^NSComparisonResult(Student *student1, Student *student2) {
return [student1.admissionDate compare:student2.admissionDate];
}];
NSSortDescriptor 工作正常!
您应该将可变字典替换为 Student class。
@interface Student : NSObject
@property NSString *name;
@property NSString *className;
@property NSString *schoolName;
@property NSDate *admissionDate;
@end
@implementation Student
@end
这个class的用途
Student *student1 = [[Student alloc] init];
student1.name = @"Name a";
student1.className = @"4th";
student1.schoolName = @"XYZ High school";
student1.admissionDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24]; // 60 * 60 * 24 one day time interval in second
Student *student2 = [[Student alloc] init];
student2.name = @"Name b";
student2.className = @"5th";
student2.schoolName = @"XYZ High school";
student2.admissionDate = [NSDate date]; // current date
NSArray *array = [NSArray arrayWithObjects:student1,student2, nil];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"admissionDate" ascending:YES];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[descriptor]];
for (Student *student in sortedArray) {
NSLog(@"admissionDate %@", student.admissionDate);
}
请记住 [array sortedArrayUsingDescriptors:@[descriptor]] return 排序数组,而不是重新排列数组元素本身。
希望这会奏效。