按属性等于另一个数组的对象对对象数组进行排序

时间:2012-11-14 20:02:57

标签: objective-c

如何通过将另一个属性(NSString *)与另一个(NSString *)数组中的对象(已排序)进行比较来对对象数组进行排序?

我填写一个例如Person个对象按顺序排列了许多线程。然后,我希望将每个Person.name与已经订购的名称对象数组进行比较。结果是Person数组按照person.name属性的名称数组的顺序排序。

2 个答案:

答案 0 :(得分: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的链接。

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