0

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

例如我的名字数组是

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

[array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

我曾尝试使用<UNKNOWN NAME>or [UNKNOWN NAME]or<UNKONWN NAME>但他们都比安迪处于更早的位置

先感谢您。

4

3 回答 3

4

传统的

不要为缺少的名称使用特殊字符串;不要因为缺少数据而做不自然的事情。写下你自己使用的消息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

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

于 2013-06-05T03:55:47.940 回答
0

尝试使用大括号:{…}、管道:|或波浪号:~

于 2013-06-05T03:40:05.657 回答
0

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

// 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
于 2013-06-08T19:38:19.460 回答