【问题标题】:iOS, Sort allKeys of NSDictionaryiOS,对 NSDictionary 的所有键进行排序
【发布时间】:2015-04-01 15:39:06
【问题描述】:


我有一个传入的 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])在选择时将转到另一个UITableView 列出每个单独的日期连续块。非连续的日期单元格(例如索引[2][3])将不能被用户选择,因为没有更多可看的了。精明吗?

我的问题是我将 JSON 数组导入到 NSArrayNSDictionary 中。 (读者应该知道数组是有序的,而字典不是)

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

我取了allKeysNSDictionaryNSArray,这给了我非结构化字典的键的结构化数组。这我可以用来在第一个UITableView 中显示,但是它的数据结构表示与导入的结构不一样。每次都是混乱和不同的。

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

如果您的想法是“这很简单!只需使用描述符进行排序”,

喜欢这个...?

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更接近真实导入的数据结构,但不够接近

【问题讨论】:

  • 您是否查看了文档以了解对数组进行排序的所有其他方法?还是您完全依赖这里的答案,而无需自己付出任何努力?如果是这样,您认为这可以解释为什么您会被否决吗?
  • 当然(至少在我理解苹果文档的能力范围内)。我觉得有很多人觉得投票,向上或向下不需要解释或推理。我无法理解这如何使社区中的任何人受益的逻辑。除此之外,无论您是否是最初的反对者,我都感谢您的评论

标签: ios objective-c arrays uitableview nsdictionary


【解决方案1】:

您可以将响应映射到 NSArray,其中每个项目都是带有键(范围)和 NSArray 值(日期)或 NSString(单个日期)的 NSDictionary .

例子:

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
}

【讨论】:

  • 我正在调查您和 Ankit 的答案。但你的首先引起了我的注意。在结构中断时解决排序问题确实有意义,而不是稍后分配字典时。 (忽略变量)。我希望使用 isKindOfClass 或 containsCharactersInRange(类似的东西)来确定内容。会更新
  • @Simon.: 已更新答案以显示如何确定项目是否包含日期范围 (NSArray) 或单个条目 (NSString),因此您可以决定何时导航到第二个视图与第二个表视图。如果有帮助,请告诉我。
【解决方案2】:

如果我没看错的话,您希望按时间顺序显示一个包含日期范围(键)的 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,其中endDatenil 对于那些单一的日期(即25/03 /2015)。然后,您可以使用NSSortDescriptorstartDate[dateRanges allKeys] 进行排序:

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

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多