2012-12-14 66 views
4

我又陷入另一个问题,但经过很长时间。使用NSSortDescriptor排序编号

这次我有数据库(核心数据),有一个属性numbers其中包含像213879,123,4,345,56567等整数。

我需要按照类似于alphabetically的顺序以升序编号顺序获取数据。

我在下面给出的方式这样做,

fetchRequest.sortDescriptors=[NSArray arrayWithObject: 
     [NSSortDescriptor sortDescriptorWithKey:@"numbers" 
            ascending:YES 
            selector:@selector(compare:)]]; 

,但不幸的是它仅仅比较每个数字的第1位,意味着如果有2个号码,如123321,它将比较1 (first digit of first number)3 (first digit of second number)和整理它们。

当到达时,它会混淆123111(所有数字的第一个数字相同)。

如果我做错了什么或者SortDescriptor以这种方式工作? 我需要解决方案来按照升序123,133,213,451,516同样对数字进行排序。

一点要记住 在实际属性numbers将包含具有整数位数多于6 e.g 1234567,234568,235481

感谢所有谁帮助了我很多期待。

+1

第一反应是,你是比较字符串,但现在你说这是NSNumber的,我建议你重新检查由[obj className]它是说NSNumber或NSString –

+0

请告诉你数据模型。如果这是一个数字属性,它不会像这样工作。你的问题有一些缺失。 – jrturton

回答

3

看起来您的属性属于NSString类型。确保你将它做到NSNumber,然后排序将按预期工作。

在排序描述符中没有必要使用selector:@selector(compare:),因为这是默认设置。

+0

感谢您的重播。该属性的类型为“NSNumber”。 – iOmi

+0

请将您的问题修改为:(1)显示不希望的排序结果示例,以及(2)用于存储属性值的代码。 – Mundi

+0

::感谢哥们,它工作得很好。在我的Numbers中实际存在一些错误,导致了问题。我修复了这些数字并应用了您的解决方案,对我来说它工作得很好。再次感谢。 – iOmi

0
[NSSortDescriptor sortDescriptorWithKey:@"self" 
           ascending:YES 
          comparator:^(id obj1, id obj2){ 
    return [(NSString*)obj1 compare:(NSString*)obj2 
          options:NSNumericSearch]; 
}]; 

对我来说这是工作的罚款 完美

+0

问题是当你有SQLite存储你不能在NSSortDescriptor中使用比较器... –

9

试试这个:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc]initWithKey:@"rank" ascending:YES selector:@selector(localizedStandardCompare:)]; 
+2

+1,'localizedStandardCompare'适用于在NSArray中使用NSSortDescriptor进行数字排序。 – NAZIK

+0

它为我工作。非常感谢。 – RXGangam

+0

我不明白为什么,但我有一个属性'@property(strong,nonatomic)NSNumber * price;'我用(即)object.price = @(5727)设置了这个属性。如果我检查if([[object price] isKindOfClass:[NSString class]]) - 这是真的。 – WildMassacre

相关问题