如何按降序对C​​ore Data字符串属性进行排序以找到最高当前值?

时间:2014-09-28 22:52:37

标签: objective-c sorting ios7 nsarray

我有一个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];

2 个答案:

答案 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)

问题的常见解决方案是[暂时]用零填充左侧的字符整数值,这将使它们即使作为字符也能正确排序(不转换为整数)。不知道这在你的特定情况下是否可行,但我之前使用过那种方法。