根据值列表对NSArray进行排序?

时间:2017-06-23 09:13:50

标签: ios objective-c sorting nsarray

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

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

NSString* language; //- may contain value @"FR", @"NL", @"SP", @"EN", and others languages

我们如何根据以下值列表进行排序:


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

预期结果应如下所示:

- FR
- FR
- NL
- NL
- NL
- SP
- SP
- EN
- EN
- EN
- other languages 
...

4 个答案:

答案 0 :(得分: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;
    }];
}

答案 1 :(得分:1)

“如何根据某些特定的有趣顺序进行排序”这一问题的最佳答案总是使用其中一种方法。 使用基于NSPredicate的排序可以实现某些排序,但基于块的更灵活且更容易。

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

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 } ]; ,它提供了所需的元素排序。概括地说,算法是:

  1. 分别从sortingByListlanguageX获取languageYx
  2. y中获取NSArrayindexX的索引(使用标准indexY方法),languageXlanguageY。如果在数组中没有出现任何一个,则将索引设置为大于最大索引值。
  3. 比较sortingByListindexX并将结果作为结果返回。
  4. 如果步骤(3)将indexYx等同,则可能需要根据对象的其他属性进行二次排序。使用基于块的排序的好处是您可以根据任意数量的键轻松排序。

    如果您遇到问题,请执行一个正确命令对象的块,询问一个新问题,显示您的代码,并解释您遇到的问题。毫无疑问,有人会在这一点上再次帮助你。

    HTH

答案 2 :(得分:0)

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

  

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

答案 3 :(得分:0)

NSArray *array = @[@"FR", @"NL", @"SP",@"NL", @"EN",@"FR"];
NSArray *sortedArray = [array sortedArrayUsingSelector:
                        @selector(localizedCaseInsensitiveCompare:)];
NSLog(@"sortedArray is --%@",sortedArray);

Out put is

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

相关问题