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 数组导入到 NSArrayNSDictionary 中。 (reader 应该知道数组是有序的,而字典不是)

NSArray 的导入数据结构化为真。问题是我无法显示第一个 UITableView 中的键,从中可以用相关值填充第二个 UITableView

我取 NSDictionaryallKeysNSArray,这给了我非结构化字典的键的结构化数组。我可以用它在第一个 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 类型 NSDatestartDateendDate,其中endDate 对于那些单一日期(即 25/03/2015)是 nil。然后,您可以使用 NSSortDescriptorstartDate[dateRanges allKeys]:

进行排序
NSArray *dateKeys = [self.dateRanges allKeys];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"startDate" ascending:NO];
NSArray *reverseOrder = [dateKeys sortedArrayUsingDescriptors:@[ descriptor ]];