ラベル nsarray の投稿を表示しています。 すべての投稿を表示
ラベル nsarray の投稿を表示しています。 すべての投稿を表示

2012年12月16日日曜日

NSDictionaryの特定のキーでソートしちゃる

どうも、俺@まだ勉強中です。

例えばNSArray(またはNSMutableArray)内にNSDictionaryが複数入っているとして、そのNSArrayをNSDictionaryのとあるキーでソートしたい場合。

NSArray *array = [NSArray arrayWithObjects:@[
        @{@"id":@100, @"name":@"bob"},
        @{@"id":@14,  @"name":@"ken"},
        @{@"id":@531, @"name":@"john"},
        @{@"id":@32,  @"name":@"mike"},
        @{@"id":@65,  @"name":@"kozy"},
        @{@"id":@174, @"name":@"shorn"},
        @{@"id":@7,   @"name":@"scott"},
        @{@"id":@865, @"name":@"mikeal"},
        @{@"id":@31,  @"name":@"fun"}
    ]];
このarrayを格納しているNSDictionaryのキー:idでソートしちゃりたい!場合は、
// NSSortDescriptorを生成して
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];
// 配列に入れておいて
NSArray *sortarray = [NSArray arrayWithObject:sortDescriptor];
// ソートしちゃる!
NSArray *resultarray = [array sortedArrayUsingDescriptors:sortarray];
// 不要なオブジェクトは解放しちゃる
[sortDescriptor release];
これでキー:idの値でソートされます。


以上でぇぇえぇぇぇえぇす。

Objective-Cの高速列挙は順番保証されない

どうも、俺@勉強中です。

Objective-Cの高速列挙(for ... in ...)は配列全体を走査するのにとても便利なんだけど、取得される順番が保証されません。
# NSDictonaryのキーの順番通りに値を取り出したい!とする。
NSDictionary *dictionary = @{
    @"1": @{@"name":@"bob"},
    @"2": @{@"name":@"ken"},
    @"3": @{@"name":@"john"},
    @"4": @{@"name":@"mike"},
    @"5": @{@"name":@"kozy"},
    @"6": @{@"name":@"shorn"},
    @"7": @{@"name":@"scott"},
    @"8": @{@"name":@"mikeal"},
    @"9": @{@"name":@"fun"}
};

for (id key in dictionary) {
    NSLog(@"%@", key); // 1,2,3,...と出てくれない
}
順番通りに取り出したい時困る。
なので回避策としてNSArray#sortedArrayUsingComparatorを使う方法があります。
// 一旦NSDictionaryのキーを取得して
NSArray *keys = [dictionary allKeys];

// sortedArrayUsingComparatorを使ってキーをソート
keys = [keys sortedArrayUsingComparator:^(id o1, id o2) {
    return [o1 compare:o2];
}];

// 確認すると順番通りそ
NSLog(@"%@", keys);
NSMutableArray *array = [NSMutableArray array];

// あとは順番通りに値を取得する
for (id key in keys) {
    [array addObject:[dictionary objectForKey:key]];
}

// 完璧!
NSLog(@"%@", array);
これで最初のNSDictionaryのキー順番通りに値を取得できます

以上でぇぇえぇぇす。