使用NSNumbers对字典数组进行排序

时间:2014-06-01 15:10:54

标签: ios objective-c

我有一个有字典的数组。每个字典都是:

NSDictionary *imageAndIndex=[[NSDictionary alloc] initWithObjectsAndKeys:image,[NSNumber numberWithLong:index], nil];

对象为image,密钥为NSNumber密钥,由索引构成。

我想根据NSNumbers索引对数组进行排序,以便它成为:

0,1,2,3,4 ..

我如何使用NSSortDescriptor

1 个答案:

答案 0 :(得分:3)

问题(以及此处的争论)因两个因素而变得复杂:1)OP设计选择基于字典键而不是值进行排序。评论中的@sooper正确地指出,更好的设计是添加一个@“sortBy”键,其值是要排序的NSNumber。 2)第二个复杂问题是问题对NSSortDescriptor的引用,它将取决于给定键的值,而不是键本身。

我认为正确的答案是采用@sooper建议来添加@“sortBy”键值对,但是如果你必须按原样对数据进行排序......

- (void)sortDictionaries {

    NSDictionary *d0 = @{ @0: someUIImage0};
    NSDictionary *d1 = @{ @1: someUIImage1};
    NSDictionary *d2 = @{ @": someUIImage2};

    NSArray *unsorted = @[d1, d2, d0];

    NSArray *sorted = [unsorted sortedArrayUsingComparator:^(NSDictionary *obj1, NSDictionary *obj2) {
        NSNumber *key1 = [self numericKeyIn:obj1];
        NSNumber *key2 = [self numericKeyIn:obj2];
        return [key1 compare:key2];
    }];

    NSLog(@"%@", sorted);
}

- (NSNumber *)numericKeyIn:(NSDictionary *)d {
    // ps.  yuck.  what do we want to assume here?
    // that it's a dictionary?
    // that it has only one key value pair?
    // that an NSNumber is always one of the keys?

    return [d allKeys][0];
}

不确定为什么我们不得不用这么多的恶劣处理这件事。这是编程,它应该很有趣!

无论如何,以下是使用排序键和排序描述符的方法:

- (void)betterSortDictionaries {

    NSDictionary *d0 = @{ @"image":image1, @"sortBy":@0 };
    NSDictionary *d1 = @{ @"image":image2, @"sortBy":@1 };
    NSDictionary *d2 = @{ @"image":image3, @"sortBy":@2 };

    NSArray *unsorted = @[d1, d2, d0];

    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"sortBy" ascending:YES];
    NSArray *sorted = [unsorted sortedArrayUsingDescriptors:@[descriptor]];

    NSLog(@"%@", sorted);

}