如何根据值列表对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 ...
答案 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
}
];
,它提供了所需的元素排序。概括地说,算法是:
sortingByList
和languageX
获取languageY
和x
y
中获取NSArray
和indexX
的索引(使用标准indexY
方法),languageX
和languageY
。如果在数组中没有出现任何一个,则将索引设置为大于最大索引值。sortingByList
和indexX
并将结果作为结果返回。如果步骤(3)将indexY
和x
等同,则可能需要根据对象的其他属性进行二次排序。使用基于块的排序的好处是您可以根据任意数量的键轻松排序。
如果您遇到问题,请执行一个正确命令对象的块,询问一个新问题,显示您的代码,并解释您遇到的问题。毫无疑问,有人会在这一点上再次帮助你。
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
)