2012-03-16 6 views
1

私はNSSortDescriptorを使用してNSArrayNSDictionaryに分類しています。私のソートキーの空白の値を持つ辞書項目が、ソートされたリストの最後に表示されることを希望している点を除いて、素晴らしいものです。簡単にこれを達成する方法はありますか?または、カスタム並べ替え関数を作成する必要がありますか?そして、いいえ、私はそれをDESCの順序に設定したくないです...私はソートされた結果をA、A、B、B、C、空白、空白のようにしたいと思います。NSSortDescriptorを使用してソートの最後に空の文字列を簡単に挿入できますか?

+0

空白の値はどういう意味ですか?値なし、空文字列、空白または 'NSNull'? – Costique

+0

私は空の文字列を意味しました。 NSDictionaryをplistからロードします。値は、です。 – Bryan

答えて

1

カスタム比較を使用して別の例を見た後にこれを見てください。 ...両方の文字列が空であれば比較演算はNSOrderedSameを返し

@interface NSString (CustomStatusCompare) 
- (NSComparisonResult)customStatusCompare:(NSString*)other; 
@end 

@implementation NSString (CustomStatusCompare) 
- (NSComparisonResult)customStatusCompare:(NSString*)other { 
    NSAssert([other isKindOfClass:[NSString class]], @"Must be a NSString"); 
    if ([self isEqual:other]) { 
     return NSOrderedSame; 
    } 
    else if ([self length] > 0 && [other length] > 0) { 
     return [self localizedCaseInsensitiveCompare:other];   
    } 
    else if ([self length] > 0 && [other length] == 0) { 
     return NSOrderedAscending; 
    } 
    else { 
     return NSOrderedDescending; 
    } 
} 
@end 



NSSortDescriptor *serviceTypeDescriptor = 
[[NSSortDescriptor alloc] initWithKey:@"Service" 
          ascending:YES 
          selector:@selector(localizedCaseInsensitiveCompare:)]; 

NSSortDescriptor *locationDescriptor = 
[[NSSortDescriptor alloc] initWithKey:@"Location" 
          ascending:YES 
          selector:@selector(customStatusCompare:)]; //using custom comparison here! 

NSArray *descriptors = [NSArray arrayWithObjects:locationDescriptor, nameDescriptor, nil];   
self.navArray = [self.navArray sortedArrayUsingDescriptors:descriptors]; 

両方の文字列が空である場合にのみ、1つの文字列が空の場合...正規の比較関数を呼び出します。ここで私がなってしまったコードがありますその比較の通常の順序を逆にします。 Voila!

+0

うわー、ごめんなさい、私は何とかあなたの質問を間違って読んで、最初に先頭の空白文字を含む文字列を望んでいたと思った:/私は読書の仕事に行きます... –

0

NSDiacriticInsensitiveまたはNSCaseInsensitiveの代わりにNSNumericSortを使用して並べ替えを行います。空白はおそらくasciiコードで256なので、リストの後ろに送られます。

0

編集:私は疑問を誤解し、先頭のスペースを先頭にソート順の文字列を挿入することを意図していました。

あなたはこのようなものがほしいと思います。これは完全にテストされておらず、複数の先頭スペースを考慮していません。よりエレガントな方法があると確信していますが、それは仕事を完了させるべきです。

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    NSString *str1 = (NSString *)obj1; 
    NSString *str2 = (NSString *)obj2; 

    BOOL str1HasSpace = [str1 hasPrefix:@" "]; 
    BOOL str2HasSpace = [str2 hasPrefix:@" "]; 

    if (str1HasSpace && !str2HasSpace) { 
     return NSOrderedAscending; 
    } else if (str2HasSpace && ! str1HasSpace) { 
     return NSOrderedDescending; 
    } else { 
     return [[str1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] compare:[str2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]]; 
    } 
}]; 
+0

ありがとう、私はあなたがここに行くのを見ます。私がやったことは非常に似ていました...ブロックの代わりにこのカスタム比較を独自のメソッドのNSStringカテゴリに入れました(それは正しい名前ですか?)。 – Bryan

+0

はい、カテゴリは正しい名前です。 –

関連する問題