【问题标题】:Sort NSArray based on a list of values? [duplicate]根据值列表对 NSArray 进行排序? [复制]
【发布时间】:2017-06-23 09:13:50
【问题描述】:

如何根据值列表对 NSArray 进行排序?例如:

NSArray 的一个对象有一个属性:

NSString* 语言; //- 可能包含值@"FR"、@"NL"、@"SP"、@"EN" 和其他语言

我们如何根据值列表进行排序,例如:

NSArray* sortByList = @[@"FR", @"NL", @"SP", @"EN"];

预期结果应如下所示:

- 法国 - 法国 - 荷兰 - 荷兰 - 荷兰 - SP - SP - 英文 - 英文 - 英文 - 其他语言 ...

【问题讨论】:

  • @NiravD:其他语言,我不在乎。
  • 那么你很高兴

标签: ios objective-c sorting nsarray


【解决方案1】:
- (NSArray*) sortArray:(NSArray *)language withOrder:(NSArray *)sortingByList
{
    return [language sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        NSUInteger pos1 = [sortingByList indexOfObject:obj1];
        NSUInteger pos2 = [sortingByList indexOfObject:obj2];
        if (pos1 < pos2)
            return NSOrderedAscending;
        else if (pos1 == pos2)
            return NSOrderedSame;
        else
            return NSOrderedDescending;
    }];
}

【讨论】:

  • 我在示例应用程序上测试过,language 数组将按照sortingList 进行排序。不在排序列表中的项目将位于结果数组的末尾。 ...如果我正确理解了任务。
  • 您的代码运行良好,但缺少对每个对象属性的访问。应该是 indexOfObject:[obj1 valueForKey:@"language"]。如果是嵌套属性,情况会更复杂。无论如何,好方法。
  • @chipbk10 其他语言呢,因为这个解决方案不会对其他语言进行排序,它会将所有其他语言放在最后而不排序它你想最后对其他语言进行排序吗?
  • @NiravD:不,我最后不需要对其他语言进行排序。但如果你想对其他语言进行排序,我认为这并不难。当 pos1 == pos2 时就是这种情况,你比较 2 个字符串并返回适当的值。
  • @chipbk10 不,当 pos1 和 post 等于 NSNotFound 或其中一个等于 NSNotFound 时,情况并非如此。
【解决方案2】:

对于“我如何根据一些特别有趣的顺序进行排序”这个问题的最佳答案总是使用一种采用块的方法。 一些排序可以使用基于NSPredicate的排序来实现,但基于块的排序更灵活并且通常更容易。

这些方法采用的块将传递两个元素,并且必须根据这两个元素的顺序返回一个值。例如使用NSArray的sortedArrayUsingComparator:

NSArray *sorted
 = [someArray
    sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull x, id _Nonnull y)
    {
       // return NSOrderedAscending,
       // NSOrderedSame or
       // NSOrderedDescending based
       // on the order of x and y
    }
   ];

在您的情况下,您有一个数组sortingByList,它给出了所需的元素顺序。概括地说,算法是:

  1. 分别从x和y获取languageX和languageY
  2. 获取languageX 和languageY 中sortingByList 的索引(使用标准NSArray 方法)indexX 和indexY。如果数组中没有出现任何一个,则将索引设置为比最大索引大一。
  3. 比较 indexX 和 indexY 并返回它们的排序结果。

如果步骤 (3) 将 x 和 y 列为相等,您可能希望根据对象的其他一些属性进行二次排序。使用基于块的排序的一个好处是您可以轻松地根据任意数量的键进行排序。

如果您在实现一个正确排序对象的块时遇到困难,请提出一个新问题、显示您的代码并解释您遇到的问题。毫无疑问,到时候有人会再次帮助你。

HTH

【讨论】:

    【解决方案3】:

    使用下面的代码对包含字符串元素的数组进行排序。 unsortedStrings 是 NSArray,其中包含未排序的字符串元素。

    NSArray *sortedStrings = [unsortedStrings sortedArrayUsingSelector:@selector(compare:)];

    【讨论】:

      【解决方案4】:
      NSArray *array = @[@"FR", @"NL", @"SP",@"NL", @"EN",@"FR"];
      NSArray *sortedArray = [array sortedArrayUsingSelector:
                              @selector(localizedCaseInsensitiveCompare:)];
      NSLog(@"sortedArray is --%@",sortedArray);
      

      输出是

      SortedArray is --(
      EN,
      FR,
      FR,
      NL,
      NL,
      SP
      

      )

      【讨论】:

      • 你在 sortedArrayUsingSelector 上遗漏了什么:.....?
      • 是的,我已经完成了,请检查。我在我的代码中进行了测试。所以我错过了写堆栈溢出。现在你可以检查了
      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多