我有一个有字典的数组。每个字典都是:
NSDictionary *imageAndIndex=[[NSDictionary alloc] initWithObjectsAndKeys:image,[NSNumber numberWithLong:index], nil];
对象为image
,密钥为NSNumber
密钥,由索引构成。
我想根据NSNumbers
索引对数组进行排序,以便它成为:
0,1,2,3,4 ..
我如何使用NSSortDescriptor
?
答案 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);
}