如何通过将对象的一个属性 ( NSString *
) 与另一个 ( ) 数组中的对象(已经排序)进行比较来对对象数组进行排序NSString *
?
我按照多个线程恰好完成的顺序填充了一个对象数组Person
。然后我想将每个Person.name
对象与一个已经排序的名称对象数组进行比较。结果将是按属性Person
按与名称数组相同的顺序排序的数组。person.name
如何通过将对象的一个属性 ( NSString *
) 与另一个 ( ) 数组中的对象(已经排序)进行比较来对对象数组进行排序NSString *
?
我按照多个线程恰好完成的顺序填充了一个对象数组Person
。然后我想将每个Person.name
对象与一个已经排序的名称对象数组进行比较。结果将是按属性Person
按与名称数组相同的顺序排序的数组。person.name
您可以尝试类似的方法,但细节很少,这是我能想到的最好的:
NSArray *array1 = [NSArray array];
NSArray *sortedArray = [NSArray array];
NSMutableArray *tmpArray = [NSMutableArray array];
for (id object in sortedArray)
{
if ([array1 containsObject:object])
[tmpArray addObject:object];
}
此代码循环抛出已排序的数组并检查未排序的数组是否包含相同的对象。如果是,则将其放在 tmpArray 中。如果完成,它将有一个排序数组,其中包含它包含的项目。
这是我发现NSPredicate
用于更优化解决方案的链接https://stackoverflow.com/a/2873439/507299。
也许是这样的
NSMutableArray *excluded = [NSMutableArray array];
NSArray *sortedNames = @[@"name1", @"name5", @"name3", /*more names*/ @"nameX"];
NSArray *tmp = [inputArray sortedArrayUsingComparator: ^(id p1, id p2) {
NSUInteger pos1 = [sortedNames indexOfObject:((Person *)p1).name];
NSUInteger pos2 = [sortedNames indexOfObject:((Person *)p2).name];
if (pos1 == NSNotFound && ![excluded containsObject:p1]) {
[excluded addObject:p1];
}
if (pos2 == NSNotFound && ![excluded containsObject:p2]) {
[excluded addObject:p2];
}
if (pos1 == pos2) return NSOrderedSame;
if (pos1 > pos2) return NSOrderedDescending;
return NSOrderedAscending;
}];
NSArray *sortedArray = [tmp subarrayWithRange:NSMakeRange(0, [tmp count] - [excluded count])];