【问题标题】:How to sort NSArray of NSDictionary items如何对 NSDictionary 项目的 NSArray 进行排序
【发布时间】:2013-04-25 21:39:51
【问题描述】:

我有一个 NSDictionaries 的 NSArray,我想对其进行排序和删除重复项。我遇到的问题是 NSDictionary 包含两个元素 startYearfinishYear 所以我有一个字典值的 NSArray,我想使用 startYear and强>完成年。

NSDictionary 看起来像这样,它们都包含字符串值。

starYear
finishYear

两者中包含的值如下所示 -

(startYear / finishYear)
------------------------
(0 - 1999)
(1999 - 0)
(1999 - 2000)
(2001 - 2008)
(2000 - 2010)
(0 - 1999)
(0 - 2006)

应该是这样的 -

(startYear / finishYear)
------------------------
(0 - 1999)
(1999 - 0)
(1999 - 2000)
(0 - 2006)
(2000 - 2010)
(2001 - 2008)

如您所见,所有重复值均已删除。 如果 startYear 为 0,则该值按 finishYear 排序。 如果 startYear 和 finishYear 可用,则将其排序到它的 startYear 中,然后根据完成年份排序。

我什至不知道如何处理这个问题,我已经阅读了关于集合等的内容。但我只是不知道如何根据 NSDictionary 中的两个元素进行排序。

我希望这是足够的信息以获得一些帮助,建议代码示例任何让我解决这个问题的建议将不胜感激。

【问题讨论】:

  • 您可以使用@Skotch 建议的技术轻松地先排序 startYear,然后是 finishYear 或反向排序,但您的似乎两者都不是。例如,您将如何处理 1996-2012 的范围?
  • 1996 - 2012 将首先出现在这种情况下。如果它的 1996 - 0 将出现在您的示例之前.. 如果它的 0 - 2012 它将出现在数组的后面。

标签: objective-c nsarray nsdictionary


【解决方案1】:

为此,您可以使用 NSOrderedSet 或 NSArray。让我们假设一个数组,您使用比较器对其进行排序。像这样的:

NSString const * kStartYear = @"startYear";
NSString const * kFinishYear = @"finishYear";

NSArray *unsortedArray = @[
                           @{kStartYear:@0,
                             kFinishYear:@1999},
                           @{@"startYear":@1999,
                             kFinishYear:@0},
                           @{kStartYear:@1999,
                             kFinishYear:@2000},
                           @{kStartYear:@2001,
                             kFinishYear:@2008},
                           @{kStartYear:@2000,
                             kFinishYear:@2010},
                           @{kStartYear:@0,
                             kFinishYear:@2006},
                           ];

NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDictionary *dictA = a;
    NSDictionary *dictB = b;

    NSNumber *startYear1 = dictA[kStartYear];
    NSNumber *startYear2 = dictB[kStartYear];
    return [startYear1 compare:startYear2];

    // Put in more logic for your comparison
}];


NSLog(@"sorted: %@", sortedArray);

更新:更正确的代码

【讨论】:

  • 好的,感谢您的回复.. 循环进入比较器然后再次阅读您的代码.. :P 之前从未使用过类似的东西 :P 感谢您的回复。
  • 好吧..这很好..如果开始年份对我自己来说,我将尝试弄清楚如何对结束年份进行排序......希望一切顺利哈哈......非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多