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之后再进行排序。我想我没有提到整个要求,因此如果没有其他选择,我应该选择您的答案作为接受答案。但是如果您修改数据,那么在某个时候您将不得不撤消更改。