2012-11-14 28 views
0

如何通过比较其中一个属性(NSString *)与另一个(NSString *)数组中的对象(NSString *)来排序对象数组?按属性排列对象数组等于另一个数组的对象

我填充了一个数组, Person对象中有多个线程完成的顺序。然后,我想将每个Person.name与已经排序的名称对象数组进行比较。结果将是Person数组按照与person.name属性相同的顺序排列。

+0

你有一个代码示例,或至少有一些输入的实例和预期产出? – Joe

+0

更新的问题谢谢。有没有一个排序描述符,而不是写一个自定义解决方案? – jarryd

回答

1

你可以尝试一些与此类似,用很少的细节就是最好的我能想出:

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

+0

谢谢,是的,我想到了这一点,但想知道是否有使用排序描述符的更优化的解决方案。 – jarryd

+0

有'NSPredicate'缩短代码让我看看我能否找到一个例子。 –

+0

感谢您的链接。 – jarryd

0

也许类似的东西

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])]; 
相关问题