Objective c 目标c中字符串比较的最后一个字符是什么?

Objective c 目标c中字符串比较的最后一个字符是什么?,objective-c,string,sorting,Objective C,String,Sorting,在我的应用程序中,我从通讯录中读取联系人,但对于其中一些联系人,姓名字段为空。我想使用一个特殊的字符串将它们放在列表的末尾。我应该使用什么样的特殊字符串来确保当数组按升序排序时,将缺少姓名的人放在数组的末尾 例如,我的名字数组是 array = @[@"Andy", @"Brad", @"Zoro", @"[missing name]"]; [array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

在我的应用程序中,我从通讯录中读取联系人,但对于其中一些联系人,姓名字段为空。我想使用一个特殊的字符串将它们放在列表的末尾。我应该使用什么样的特殊字符串来确保当数组按升序排序时,将缺少姓名的人放在数组的末尾

例如,我的名字数组是

array = @[@"Andy", @"Brad", @"Zoro", @"[missing name]"];

[array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
我试过使用
[未知姓名]
但结果都比安迪更早


提前谢谢。

尝试使用花括号:
{…}
,管道:
{/code>,或波浪形:
~
尝试使用花括号:
{…}
,管道:
,或波浪形:
不要对缺少的名称使用特殊字符串;不要仅仅因为缺少数据就做不自然的事情。使用
localizedCaseInsensitiveCompare:
编写您自己的邮件,并将其放在
NSString
上您自己的类别中

// NSStringEmptyLast.h
@interface NSString (EmptyLast)

- (NSComparisonResult)localizedCaseInsensitiveCompareEmptyLast:(NSString *)aString

@end


// NSStringEmptyLast.m
#import NSStringEmptyLast.h
@implementation NSString (EmptyLast)

- (NSComparisonResult)localizedCaseInsensitiveCompareEmptyLast:(NSString *)aString {
    if ([self length] == 0 && [aString length] == 0) {
        return NSOrderedSame;
    } else if ([self length] == 0 && [aString length] != 0) {
        return NSOrderedDescending;
    } else if ([self length] != 0 && [aString length] == 0) {
        return NSOrderedAscending;
    } else {
        return [self localizedCaseInsensitiveCompare:aString];
    }
}

@end
然后,使用:

[array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompareEmptyLast:)];
不要害怕为现有类添加消息

阻碍 或者,如果您不想编写类别,请使用

- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr
其中,
cmptr
是一个
NSComparator
块,它应该与上面给出的消息等效。

不要对缺少的名称使用特殊字符串;不要仅仅因为缺少数据就做不自然的事情。使用
localizedCaseInsensitiveCompare:
编写您自己的邮件,并将其放在
NSString
上您自己的类别中

// NSStringEmptyLast.h
@interface NSString (EmptyLast)

- (NSComparisonResult)localizedCaseInsensitiveCompareEmptyLast:(NSString *)aString

@end


// NSStringEmptyLast.m
#import NSStringEmptyLast.h
@implementation NSString (EmptyLast)

- (NSComparisonResult)localizedCaseInsensitiveCompareEmptyLast:(NSString *)aString {
    if ([self length] == 0 && [aString length] == 0) {
        return NSOrderedSame;
    } else if ([self length] == 0 && [aString length] != 0) {
        return NSOrderedDescending;
    } else if ([self length] != 0 && [aString length] == 0) {
        return NSOrderedAscending;
    } else {
        return [self localizedCaseInsensitiveCompare:aString];
    }
}

@end
然后,使用:

[array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompareEmptyLast:)];
不要害怕为现有类添加消息

阻碍 或者,如果您不想编写类别,请使用

- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr

其中,
cmptr
是一个
NSComparator
块,它应该与上面给出的消息等效。

以下是我的结论。因为我想避免在从数据库查询之后进行数组排序。我给没有名字的人设置了一个假字符串。这可能不是最优雅的答案,但如果我以升序从核心数据中使用名称进行查询,则使用此名称的人将出现在最后

// Person+UnknownName.h
@interface Person (UnknownName)

+ (NSString)unknownName

@end

// Person+UnknownName.m
#import "Person+UnknownName.h"
@implementation Person (UnknownName)

+ (NSString)unknownName {
    unichar lastcharacter = 0xffffffff;
    NSString * UNKNOWN_NAME = [NSString stringWithCharacters:&lastcharacter length:1];
}

@end

这就是我的结局。因为我想避免在从数据库查询之后进行数组排序。我给没有名字的人设置了一个假字符串。这可能不是最优雅的答案,但如果我以升序从核心数据中使用名称进行查询,则使用此名称的人将出现在最后

// Person+UnknownName.h
@interface Person (UnknownName)

+ (NSString)unknownName

@end

// Person+UnknownName.m
#import "Person+UnknownName.h"
@implementation Person (UnknownName)

+ (NSString)unknownName {
    unichar lastcharacter = 0xffffffff;
    NSString * UNKNOWN_NAME = [NSString stringWithCharacters:&lastcharacter length:1];
}

@end

我使用特殊字符串的原因是,我希望避免从核心数据加载后进行额外排序。我想如果可以通过nsfetchrequest进行排序,那么在获取coredata后我不需要再进行排序。我想我没有提到整个要求,因此如果没有其他选择,我应该选择您的答案作为接受答案。但是如果您修改数据,我之所以使用特殊字符串,是为了避免从核心数据加载后进行额外排序。我想如果可以通过nsfetchrequest进行排序,那么我不需要在获取coredata之后再进行排序。我想我没有提到整个要求,因此如果没有其他选择,我应该选择您的答案作为接受答案。但是如果您修改数据,那么在某个时候您将不得不撤消更改。