NSSortDescriptor将字符串字段排序为数字,比较器块不起作用

Jin*_*Kim 5 core-data ios

我有一个充满来自第三方的ID的字段.id是数字,但是作为字符串写入db.

我想在整数的值上对这个id排序的提取进行排序.所以我把它添加NSSortDescriptor到了NSFetchRequest.

NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];
[numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:@"someId" ascending:YES comparator:^(id a, id b) {
    return [[numFormatter numberFromString:a] compare:[numFormatter numberFromString:b]];
}];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortBy]];
Run Code Online (Sandbox Code Playgroud)

但我得到的结果如下.这些仍然按字母顺序排序为字符串.

730275292
73900038
730172867
7350727
830138437
835164
837287901
8338804
930274
9324376
Run Code Online (Sandbox Code Playgroud)

我对使用这个比较器块有什么不了解?

编辑2012年5月1日美国东部时间上午9:20

为了测试是否正在使用比较器块,我尝试了以下内容,根据字段的长度进行排序.

NSSortDescriptor *sortBy = [[NSSortDescriptor alloc] initWithKey:@"fbId" ascending:YES comparator:^(id a, id b) {
    if ([a length] < [b length]) {
        return NSOrderedAscending;
    } else if ([a length] > [b length]) {
        return NSOrderedDescending;
    } else {
        return NSOrderedSame;
    }
}];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortBy]];
Run Code Online (Sandbox Code Playgroud)

我仍然按字母顺序排序结果!所以这让我觉得比较器块甚至没有被使用.

716164250
726354466
73900038
739600038
7450727
810138437
801164
801375346
8213997
Run Code Online (Sandbox Code Playgroud)

Max*_*Max 11

Try this !

[NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES
selector:@selector(localizedStandardCompare:)]
Run Code Online (Sandbox Code Playgroud)

  • 如果名称数据类型为double,则不会对名称进行排序 (2认同)

Aar*_*man 1

我不使用 NSFetchRequest 所以我不能具体评论,但它似乎与它相关。您在比较器块中使用的代码就很好。我设置了一个由您显示的确切数字组成的数组,然后使用您的代码对它们进行排序,一切顺利:

\n\n
    NSArray *array = [NSArray arrayWithObjects:@"730275292",\n                      @"73900038",\n                      @"730172867",\n                      @"7350727",\n                      @"830138437",\n                      @"835164",\n                      @"837287901",\n                      @"8338804",\n                      @"930274",\n                      @"9324376", nil];\n    NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];\n    [numFormatter setNumberStyle:NSNumberFormatterDecimalStyle];\n    NSArray *sArray = [array sortedArrayUsingComparator:^(id a, id b) {\n        return [[numFormatter numberFromString:a] compare:[numFormatter numberFromString:b]];\n    }];\n    NSLog(@"%@",sArray);\n
Run Code Online (Sandbox Code Playgroud)\n\n

当上面的代码运行时,我得到一个日志:

\n\n
(\n    835164,\n    930274,\n    7350727,\n    8338804,\n    9324376,\n    73900038,\n    730172867,\n    730275292,\n    830138437,\n    837287901\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我相信这就是您正在寻找的订单。您可能会考虑获取提取请求的结果,并在收到它们后将它们排序在数组中。我怀疑数组进行排序还是获取请求进行排序是否重要。使用其中一种很可能不会比另一种获得任何性能提升。

\n\n

如果您仍然希望 NSFetchRequest 进行排序,那么为了让它正确排序,您可能缺少一些东西。老实说,我不确定,因为我没有使用过它。

\n\n

更新

\n\n

快速浏览 NSFetchRequest 文档,我发现有一些参数会影响排序。例如,在它的文档中resultType给出了以下消息:

\n\n
\n

您可以使用 setResultType: 设置执行请求时返回的对象的实例类型\n\xe2\x80\x94有关可能的值,请参阅\n \xe2\x80\x9cNSFetchRequestResultType。\xe2\x80\x9d 如果将该值设置为\ NSManagedObjectIDResultType,如果您不在请求中包含属性值,这会将任何排序顺序降级为 \n \xe2\x80\x9cbest尽力\xe2\x80\x9d 提示。

\n
\n\n

所以看起来返回类型可能会影响您的排序。

\n