我有一个CordData商店,主要的"键"是一个字符串;我需要将该键属性按降序排序,以便找到当前最高的键。我知道我必须将密钥转换为int进行排序,但是从那里我失去了使用比较器(我不经常使用它们来获得任何有意义的经验)。到目前为止,这是我的代码(这是错误的,我知道):
NSArray *sortedArray;
NSString *predicateString = [NSString stringWithFormat:@"sku > %d",0];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
NSArray *skuRecord = [Books MR_findAllWithPredicate:predicate];
sortedArray = [skuRecord sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSString *first = [(Books*)a sku];
NSString *second = [(Books*)b sku];
return [first compare:second];
}];
返回的是' 1',这是最低的SKU。我已经看了几个小时的SO和谷歌,并没有找到任何有助于解决这个问题的方法。有人可以告诉我我的代码有什么问题吗?我很感激。
更新:这是我最终提出的代码:
NSString *predicateString = [NSString stringWithFormat:@"sku > %d",0];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
NSArray *unsortedArray = [Books MR_findAllWithPredicate: predicate];
int highestSKU = 0;
for(int i = 0; i < unsortedArray.count; i++) {
Books *booksManagedObject = (id)unsortedArray[i]; // now in Books array to be able to access .sku
NSString *givenSKU = booksManagedObject.sku;
if([givenSKU intValue] > highestSKU)
highestSKU = [givenSKU intValue];
}
return [NSString stringWithFormat:@"%d",highestSKU];
答案 0 :(得分:1)
您可以使用带字符串的NSSortDescriptors进行排序,无需转换为整数。
NSArray *unsortedArray = @[@"3",@"2",@"5",@"1",@"4"];
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"" ascending:NO];
NSArray *sortedArray = [unsortedArray sortedArrayUsingDescriptors:@[sorter]];
NSLog(@"First = %@, Last = %@",sortedArray[0],[sortedArray lastObject]);
打印:首先= 5,最后= 1
所以要么我在你的解释中遗漏了某些东西,反之亦然。你是否将升序设为NO? 你认为你的代码应该更像这样;
NSArray *unsortedArray = [Books MR_findAllWithPredicate: predicate];
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"sku" ascending:NO];
NSArray *sortedArray = [unsortedArray sortedArrayUsingDescriptors:@[sorter]];
NSLog(@"First = %@, Last = %@",sortedArray[0],[sortedArray lastObject]);
答案 1 :(得分:1)
问题的常见解决方案是[暂时]用零填充左侧的字符整数值,这将使它们即使作为字符也能正确排序(不转换为整数)。不知道这在你的特定情况下是否可行,但我之前使用过那种方法。