[英]Sort NSArray based on another NSArray using sortDescriptors
我有一个NSArray
带有不遵循模式的strings
对象,例如:
DCAZX。
当我尝试按升序对相似array
进行排序时,我得到:
ACDXZ。
那不是我想要的结果,我需要实现与引用数组相同的模式。 我只是不确定如何使用NScomparisonResult
或NSSortDescriptor
做到这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。 我怀疑它比比较器快。 假设jumbledArray
是referenceArray
的子集; 如果需要,您可以解决。
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.