Objective c 如何按降序对CoreData字符串属性进行排序,以找到最高的当前值?

Objective c 如何按降序对CoreData字符串属性进行排序,以找到最高的当前值?,objective-c,sorting,ios7,nsarray,Objective C,Sorting,Ios7,Nsarray,我有一个CordData存储,其中主“键”是一个字符串;我需要将键属性按降序排序,以便找到当前最高的键。我知道我必须将键转换为int进行排序,但是从那以后我就无法使用比较器(我没有经常使用它们来获得任何有意义的经验)。以下是我目前的代码(我知道这是错误的): 返回的是“1”,这是最低的SKU。我看了SO和谷歌几个小时,没有发现任何有助于解决这个问题的东西。有人能告诉我我的代码有什么问题吗?我将不胜感激 更新:这是我最后想到的代码: NSString *predicateString = [NSS

我有一个CordData存储,其中主“键”是一个字符串;我需要将键属性按降序排序,以便找到当前最高的键。我知道我必须将键转换为int进行排序,但是从那以后我就无法使用比较器(我没有经常使用它们来获得任何有意义的经验)。以下是我目前的代码(我知道这是错误的):

返回的是“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];
NSString*谓词字符串=[NSString stringWithFormat:@“sku>%d”,0];
NSPredicate*谓词=[NSPredicate PREDITEWITHFORMAT:predicateString];
NSArray*unsortedArray=[Books MR_findAllWithPredicate:predicate];
int highestSKU=0;
for(int i=0;i最高SKU)
最高SKU=[givenSKU intValue];
}
返回[NSString stringWithFormat:@“%d”,最高SKU];

您可以使用带字符串的NSSORTDescriptor进行排序,无需转换为整数

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

所以要么我在你的解释中遗漏了什么,要么相反。你把升序设置为否了吗? 我认为您的代码应该更像这样

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]);

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

对不起,这不起作用。。。9之后仍然是10;我先要最高的值。这就是为什么字符串必须转换为int的原因;排序缺少字符串“10”作为最高字符串值。。。我将尝试RegularExpression的答案,看看是否效果更好。无论如何,这是一个进步。是的,RegularExpression用前导零/秒填充的技术应该可以解决这个问题。排序算法是将字符串从左到右一次排序一个字符,因此排序时2-9将放在10之后。在应用程序的最终版本中,sku代码是否为固定长度?如果是这样的话,这个问题不应该引起关注。此外,如果sku只包含数字,您最好首先将其作为数字存储在核心数据中。。。让我试试看(我对这一问题已经厌倦了)。。。如果有效的话,我会用点数和正确的代码来回应。我真的不需要填充它们;我刚刚转换为int并进行了比较(请参阅我更新的问题)。。。谢谢你,虽然你让我走上正轨,好好想想。我很感激。
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]);