web-dev-qa-db-ja.com

NSDictionary値をキーのアルファベット順にソートします

値でソートされた辞書キーの配列を取得できますが、辞書キーでソートされた値の配列を取得するにはどうすればよいですか?私は運が悪いとどこでも探していました。助けてくれてありがとう。

24
johnbakers

これはうまくいくかもしれません:

NSArray * sortedKeys = [[dict allKeys] sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];

NSArray * objects = [dict objectsForKeys: sortedKeys notFoundMarker: [NSNull null]];

またはSwift

let objects = dict.keys.sorted().flatMap{ dict[$0] }

または

let objects = dict.sorted{ $0.0 < $1.0 }.map{ $1 }

…だから、Swift ????

44
Ashley Mills

私の経験では、NSDictionaryをキーでソートすることはあまり役に立ちません。 loggingの後はNSDictionaryがソートされているように見えますが、テーブルビューに配置する必要がある場合は、順序が正しくありません。

キーをNSArrayプロパティに格納し、NSDictionaryのキーの順序に従ってNSArrayオブジェクトをクエリすることをお勧めします。

2
NRR

1つの方法は、ソートされた辞書キーの配列を作成し、キーの配列に基づいて値の別の配列を作成することです。

//Construct array of sorted keys
NSArray keyarray = ... //etc

NSMutableArray valuearray = [[NSMutableArray alloc] init];
for (id key in keyarray) {
    [valuearray addObject:[dict objectForKey:key]];
}
2
Sean

これを達成するために、NSDictionaryにカテゴリを作成しました。

@implementation NSDictionary (Extra)

-(NSArray *) sortedKeys {
    return [[self allKeys] sortedArrayUsingSelector:@selector(compare:)];
}

-(NSArray *) allValuesSortedByKey {
    return [self objectsForKeys:self.sortedKeys notFoundMarker:[NSNull null]];
}

-(id) firstKey {
    return [self.sortedKeys firstObject];
}

-(id) firstValue {
    return [self valueForKey: [self firstKey]];
}

@end
1
Bjinse