iOS,排序NSDictionary的所有键

时间:2015-04-01 15:39:06

标签: ios objective-c arrays uitableview 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中显示每个关联键,其中select中的连续日期单元格(索引[0]& [1])将转到另一个{ {1}}列出连续块的每个日期。非连续日期单元格(示例中的索引UITableView& [2])将无法为用户选择,因为没有更多内容可供查看。精明?

我的问题是我将JSON数组导入[3]和& NSArray。 (读者应该知道数组是有序的,而不是字典)

NSDictionary导入的数据结构正确。问题是我无法在第一个NSArray中显示密钥,从中可以使用相关值填充第二个UITableView

我接受了UITableView的{​​{1}} NSArray,它为我提供了非结构化字典的键的结构化数组。我可以用它来显示第一个allKeys,但是它的数据结构表示不适用于导入的结构。它的混乱和混乱每次都不同。

我的问题是我到底该怎么做?但我应该想象这个问题可能不够具体......那么,我如何按日期顺序对字典的NSDictionary数组进行排序?

如果您的想法,“这很容易!只需使用描述符排序”,

像这样......?

UITableView

可悲的是,这太容易了。这适用于非连续日期键或单个日期,但如果我有连续的日期键,allKeys它会失败。整体NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO]; NSArray *descriptors=[NSArray arrayWithObject: descriptor]; NSArray *reverseOrder=[self.dateKeys sortedArrayUsingDescriptors:descriptors]; 更接近真正的导入数据结构,但不够接近

2 个答案:

答案 0 :(得分:0)

您可以将回复映射到NSArray,其中每个项目都是NSDictionary,其中包含密钥(范围)和NSArray个值(日期)或{ {1}}(单日期)。

示例:

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

答案 1 :(得分:0)

如果我读了你,你想按时间顺序显示一个带有日期范围(键)的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中,但在处理字符串时,您需要将这些日期范围封装在新类中,这样可以更轻松地对其值进行排序。

例如,您可能有一个DateRange课程,其中有两个@properties类型NSDatestartDateendDate,其中endDate是这些单日期nil(即2015年3月25日)。然后,您可以使用NSSortDescriptorstartDate排序[dateRanges allKeys]

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