iOS, 对 NSDictionary 的所有键进行排序
iOS, Sort allKeys of NSDictionary
<-- 为什么我被否决了?至少评论点推理
我有一个传入的 JSON 数组,其中详细说明了连续和非连续的日期周期。
一个例子:
(请注意,根索引值是为了清晰起见。实际数据只是关联键值)
[0] => '01/01/2015 - 05/01/2015' : ['01/01/2015',
'02/01/2015',
'03/01/2015',
'04/01/2015',
'05/01/2015'],
[1] => '01/02/2015 - 05/02/2015' : ['01/02/2015',
'02/02/2015',
'03/02/2015',
'04/02/2015',
'05/02/2015'],
[2] => '25/03/2015': '25/03/2015',
[3] => '01/04/2015': '01/04/2015'
我的最终目的是在 UITableView
中显示每个关联键,其中连续的日期单元格(示例中的索引 [0]
和 [1]
)位于 select将转到另一个 UITableView
列出连续块的每个单独日期。非连续的日期单元格(示例中的索引 [2]
和 [3]
)将无法 select 供用户使用,因为没有更多内容可供查看。精明?
我的问题是我将 JSON 数组导入到 NSArray
和 NSDictionary
中。 (reader 应该知道数组是有序的,而字典不是)
NSArray
的导入数据结构化为真。问题是我无法显示第一个 UITableView
中的键,从中可以用相关值填充第二个 UITableView
。
我取 NSDictionary
的 allKeys
的 NSArray
,这给了我非结构化字典的键的结构化数组。我可以用它在第一个 UITableView
中显示,但是它的数据结构表示与导入的结构不符。每次都是混乱和不同的。
我的问题是我到底该怎么做?但我想这个问题可能不够具体....所以,我将如何按日期顺序对字典的 allKeys
数组进行排序?
如果你的想法,"Well this is easy! just sort using a descriptor",
喜欢这个...?
NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[self.dateKeys sortedArrayUsingDescriptors:descriptors];
遗憾的是,那太容易了。这适用于非连续日期键或单个日期,但在我有连续日期键的情况下,'01/01/2015 - 05/01/2015'
它失败了。整体NSArray
更接近真正导入的数据结构,但还不够接近
您可以将响应映射到 NSArray
,其中每个项目都是一个 NSDictionary
,带有一个键(范围)和一个 NSArray
值(日期)或NSString
(单个日期)。
示例:
NSArray *data = @[
@{
@"01/01/2015 - 05/01/2015" : @[
@"01/01/2015",
@"02/01/2015",
@"03/01/2015",
@"04/01/2015",
@"05/01/2015"
]
},
@{
@"25/03/2015" : @"25/03/2015"
}
];
然后,您可以填充主数组中的第一个 UITableView
,这样您就可以从数组中的每个项目中获取字典键。
NSMutableArray *table1Data = [[NSMutableArray alloc] initWithCapacity:data.count];
for (NSDictionary *dateRange in data) {
[table1Data addObject:[[dateRange allKeys] firstObject]];
}
而第二个UITableView
是从主数组中所选项目的字典(日期数组)的值填充的,只有当值为NSArray
:
id table2Data = [[data[selectedIndex] allValues] firstObject];
if ([table2Data isKindOfClass:[NSArray class]]) {
// Navigate to second view, passing table2Data as the second table view data.
// Cast table2Data to an NSArray if needed.
}
else {
// Do not navigate to the second view
}
如果我没看错的话,您想显示一个 TableView,其中的日期范围(键)按时间顺序排列如下:
Row 1: 01/01/2015 - 05/01/2015
Row 2: 01/02/2015 - 05/02/2015
Row 3: 25/03/2015
Row 4: 01/04/2015
然后,当点击第 1 行或第 2 行时,在另一个 TableView 中显示范围内的所有日期,即第 1 行:
Row 1: 01/01/2015
Row 2: 02/01/2015
Row 3: 03/01/2015
Row 4: 04/01/2015
Row 5: 05/01/2015
您确实需要将这些数据存储在 NSDictionary *dateRanges
中,但是当您处理字符串时,您需要将这些日期范围封装在新的 classes 中,这样可以更容易地对它们的值进行排序.
例如,您可能有一个 DateRange
class 和两个 @properties
类型 NSDate
:startDate
和 endDate
,其中endDate
对于那些单一日期(即 25/03/2015)是 nil
。然后,您可以使用 NSSortDescriptor
按 startDate
对 [dateRanges allKeys]
:
进行排序
NSArray *dateKeys = [self.dateRanges allKeys];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"startDate" ascending:NO];
NSArray *reverseOrder = [dateKeys sortedArrayUsingDescriptors:@[ descriptor ]];
<-- 为什么我被否决了?至少评论点推理
我有一个传入的 JSON 数组,其中详细说明了连续和非连续的日期周期。
一个例子:
(请注意,根索引值是为了清晰起见。实际数据只是关联键值)
[0] => '01/01/2015 - 05/01/2015' : ['01/01/2015',
'02/01/2015',
'03/01/2015',
'04/01/2015',
'05/01/2015'],
[1] => '01/02/2015 - 05/02/2015' : ['01/02/2015',
'02/02/2015',
'03/02/2015',
'04/02/2015',
'05/02/2015'],
[2] => '25/03/2015': '25/03/2015',
[3] => '01/04/2015': '01/04/2015'
我的最终目的是在 UITableView
中显示每个关联键,其中连续的日期单元格(示例中的索引 [0]
和 [1]
)位于 select将转到另一个 UITableView
列出连续块的每个单独日期。非连续的日期单元格(示例中的索引 [2]
和 [3]
)将无法 select 供用户使用,因为没有更多内容可供查看。精明?
我的问题是我将 JSON 数组导入到 NSArray
和 NSDictionary
中。 (reader 应该知道数组是有序的,而字典不是)
NSArray
的导入数据结构化为真。问题是我无法显示第一个 UITableView
中的键,从中可以用相关值填充第二个 UITableView
。
我取 NSDictionary
的 allKeys
的 NSArray
,这给了我非结构化字典的键的结构化数组。我可以用它在第一个 UITableView
中显示,但是它的数据结构表示与导入的结构不符。每次都是混乱和不同的。
我的问题是我到底该怎么做?但我想这个问题可能不够具体....所以,我将如何按日期顺序对字典的 allKeys
数组进行排序?
如果你的想法,"Well this is easy! just sort using a descriptor",
喜欢这个...?
NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[self.dateKeys sortedArrayUsingDescriptors:descriptors];
遗憾的是,那太容易了。这适用于非连续日期键或单个日期,但在我有连续日期键的情况下,'01/01/2015 - 05/01/2015'
它失败了。整体NSArray
更接近真正导入的数据结构,但还不够接近
您可以将响应映射到 NSArray
,其中每个项目都是一个 NSDictionary
,带有一个键(范围)和一个 NSArray
值(日期)或NSString
(单个日期)。
示例:
NSArray *data = @[
@{
@"01/01/2015 - 05/01/2015" : @[
@"01/01/2015",
@"02/01/2015",
@"03/01/2015",
@"04/01/2015",
@"05/01/2015"
]
},
@{
@"25/03/2015" : @"25/03/2015"
}
];
然后,您可以填充主数组中的第一个 UITableView
,这样您就可以从数组中的每个项目中获取字典键。
NSMutableArray *table1Data = [[NSMutableArray alloc] initWithCapacity:data.count];
for (NSDictionary *dateRange in data) {
[table1Data addObject:[[dateRange allKeys] firstObject]];
}
而第二个UITableView
是从主数组中所选项目的字典(日期数组)的值填充的,只有当值为NSArray
:
id table2Data = [[data[selectedIndex] allValues] firstObject];
if ([table2Data isKindOfClass:[NSArray class]]) {
// Navigate to second view, passing table2Data as the second table view data.
// Cast table2Data to an NSArray if needed.
}
else {
// Do not navigate to the second view
}
如果我没看错的话,您想显示一个 TableView,其中的日期范围(键)按时间顺序排列如下:
Row 1: 01/01/2015 - 05/01/2015
Row 2: 01/02/2015 - 05/02/2015
Row 3: 25/03/2015
Row 4: 01/04/2015
然后,当点击第 1 行或第 2 行时,在另一个 TableView 中显示范围内的所有日期,即第 1 行:
Row 1: 01/01/2015
Row 2: 02/01/2015
Row 3: 03/01/2015
Row 4: 04/01/2015
Row 5: 05/01/2015
您确实需要将这些数据存储在 NSDictionary *dateRanges
中,但是当您处理字符串时,您需要将这些日期范围封装在新的 classes 中,这样可以更容易地对它们的值进行排序.
例如,您可能有一个 DateRange
class 和两个 @properties
类型 NSDate
:startDate
和 endDate
,其中endDate
对于那些单一日期(即 25/03/2015)是 nil
。然后,您可以使用 NSSortDescriptor
按 startDate
对 [dateRanges allKeys]
:
NSArray *dateKeys = [self.dateRanges allKeys];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"startDate" ascending:NO];
NSArray *reverseOrder = [dateKeys sortedArrayUsingDescriptors:@[ descriptor ]];