繁体   English   中英

使用sortDescriptors根据另一个NSArray对NSArray进行排序

[英]Sort NSArray based on another NSArray using sortDescriptors

我有一个NSArray带有不遵循模式的strings对象,例如:

DCAZX。

当我尝试按升序对相似array进行排序时,我得到:

ACDXZ。

那不是我想要的结果,我需要实现与引用数组相同的模式。 我只是不确定如何使用NScomparisonResultNSSortDescriptor做到这NSSortDescriptor

第二个array可能不完全相同,但是我需要具有相同的顺序。 例如,也许我有DXA。基于参考array我需要获取DAX。

更新:

好的,这是我的代码:

- (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

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

此方法将需要在参考数组中找到要比较的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM