0

私のアプリでは、アドレス帳から連絡先を読み取りましたが、一部の名前フィールドは空です。特別な文字列を使用して、それらをリストの最後に配置したいと考えています。配列が昇順でソートされているときに、名前が欠落している人物が配列の最後に配置されるようにするには、どのような特殊文字列を使用すればよいですか?

たとえば、私の名前配列は

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

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

<UNKNOWN NAME>or [UNKNOWN NAME]orを使ってみ<UNKONWN NAME>ましたが、いずれも Andy よりも早い位置にあることが判明しました。

前もって感謝します。

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

wherecmptrNSComparatorブロックで、上記のメッセージと同等のものでなければなりません。

于 2013-06-05T03:55:47.940 に答える
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 に答える
0

中かっこ: {…}、パイプ: |、またはチルダ:を使用してみてください~

于 2013-06-05T03:40:05.657 に答える