使用sortDescriptors基于另一个NSArray对NSArray进行排序

时间:2014-02-19 11:43:06

标签: ios objective-c sorting

我有NSArraystrings个不符合模式的对象,例如:

D C A Z X.

当我尝试按升序排序类似的array时,我得到:

A C D X Z.

这不是我想要的结果,我需要实现与参考数组相同的模式。我只是不确定如何使用NScomparisonResultNSSortDescriptor执行此操作。

第二个array可能不完全相同,但我需要有相同的顺序。例如,也许我有D X A.根据参考array,我需要获得D A X.

更新:

好的,这是我的代码:

- (PFQuery *)queryForTable {
    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];

     // This is the reference array
     NSArray *labels = [@"Café da Manhã", @"Meio da Manhã", @"Almoço", @"Meio da Tarde", @"Final da Tarde", @"Jantar", @"Pós-Treino"];

    NSSortDescriptor *descriptor = 
    [NSSortDescriptor sortDescriptorWithKey:@"refeicao" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) {
        NSUInteger index1 = [labels indexOfObject:obj1];
        NSUInteger index2 = [labels indexOfObject:obj2];
        return index1 - index2;
    }];

    [query orderBySortDescriptor:descriptor];
    return query;
}

我有一个PFObject的数组,我需要通过键refeicao订购。

2 个答案:

答案 0 :(得分:3)

您需要编写自己的比较方法(可以使用排序描述符,因为您可以将其实现为NSComparator)。

此方法需要在参考数组中找到要比较的2个字符串,并使用索引位置进行比较。不会比较实际值,一切都与参考数组中相应字符串的位置有关。

答案 1 :(得分:2)

这是对原始更一般性问题的回答。它可能不是最佳效率,但看起来是O(N)-ish。我怀疑它比比较器更快。这假设jumbledArrayreferenceArray的子集;如果需要,你可以解决这个问题。

NSArray *referenceArray = @[@"S", @"E", @"T", @"Z", @"R", @"U", @"L"];
NSArray *jumbledArray = @[@"R", @"E", @"S", @"T"];

NSMutableOrderedSet *setToOrder = [[NSMutableOrderedSet alloc] initWithArray:jumbledArray];

NSUInteger insertIndex = 0;

for (NSString *refString in referenceArray) {
    NSUInteger presentIndex = [setToOrder indexOfObject:refString]; // one lookup, presumably cheap

    if (presentIndex != NSNotFound) {
        [setToOrder moveObjectsAtIndexes:[NSIndexSet indexSetWithIndex:presentIndex] toIndex:insertIndex];
        insertIndex++;
    }
}
// [setToOrder array] == @[@"S", @"E", @"T", @"R"]

您可以将其概括为一种方法,例如:

- (NSArray *)arrayBySortingArray:(NSArray *)jumbledArray usingReferenceArray:(NSArray *)referenceArray