我有NSArray
个strings
个不符合模式的对象,例如:
D C A Z X.
当我尝试按升序排序类似的array
时,我得到:
A C D X Z.
这不是我想要的结果,我需要实现与参考数组相同的模式。我只是不确定如何使用NScomparisonResult
或NSSortDescriptor
执行此操作。
第二个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
订购。
答案 0 :(得分:3)
您需要编写自己的比较方法(可以使用排序描述符,因为您可以将其实现为NSComparator
)。
此方法需要在参考数组中找到要比较的2个字符串,并使用索引位置进行比较。不会比较实际值,一切都与参考数组中相应字符串的位置有关。
答案 1 :(得分: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