如果我从您在评论中对@ACB 和@Zaph 的回复中理解正确,您需要执行以下操作:
维护一个集合,将整数键映射到按键排序的对象值。
如果我理解正确,那么数组对于您的目的来说还不够好,因为数组中的整数键不允许“漏洞”。但是,您需要考虑漏洞:在您问题的输出中,缺少 4 的键值对。出于这个原因,字典对你很有吸引力。
不幸的是,正如@Zaph 指出的那样,字典不允许您维护它包含的键值对的顺序。但是,您说,您只想显示按 a 中的键排序的字典中的值UITableView
。据推测,字典序列化到磁盘的顺序(使用writeToFile:atomically:
)并不重要,只要字典的内容在表视图中以正确的顺序显示即可。
字典可用于此目的,如下所示。首先,我们需要一个类PFXKeyValuePair
;
@interface PFXKeyValuePair : NSObject
@property (nonatomic) id<NSCopying> key;
@property (nonatomic) id value;
+ (PFXKeyValuePair *)pairWithValue:(id)value forKey:(id<NSCopying>)key;
+ (NSArray *)pairsWithValues:(NSArray *)values forKeys:(NSArray *)keys;
@end
@implementation PFXKeyValuePair
+ (PFXKeyValuePair *)pairWithValue:(id)value forKey:(id<NSCopying>)key
{
PFXKeyValuePair *pair = [[PFXKeyValuePair alloc] init];
pair.value = value;
pair.key = key;
return pair;
}
+ (NSArray *)pairsWithValues:(NSArray *)values forKeys:(NSArray *)keys
{
NSAssert(values.count == keys.count, @"The array of values must be the same size as the array of keys.");
NSUInteger count = values.count;
NSMutableArray *mutableRes = [NSMutableArray array];
for (NSUInteger index = 0; index < count; index++) {
PFXKeyValuePair *pair = [PFXKeyValuePair pairWithValue:values[index] forKey:keys[index]];
[mutableRes addObject:pair];
}
return [mutableRes copy];
}
@end
其次,我们需要一个类别方法NSDictionary
:
@interface NSDictionary (PFXAdditions)
- (NSArray *)pfx_keyValuePairsSortedByKeyUsingComparator:(NSComparator)comparator;
@end
@implementation NSDictionary (PFXAdditions)
- (NSArray *)pfx_keyValuePairsSortedByKeyUsingComparator:(NSComparator)comparator
{
NSArray *sortedKeys = [self.allKeys sortedArrayUsingComparator:comparator];
NSArray *sortedValues = [self objectsForKeys:sortedKeys notFoundMarker:[NSNull null]];
return [PFXKeyValuePair pairsWithValues:sortedValues forKeys:sortedKeys];
}
@end
注意:在上面,PFX
和pfx
是占位符。您应该用适合您项目的前缀替换它们。
然后我们可以在填充我们的UITableView
. 假设我们有一个财产
@property (nonatomic) NSDictionary *events;
让我们假设表格视图只有一个部分将显示这些事件。
然后我们可以–tableView:numberOfRowsInSection:
在我们的UITableViewController
子类中实现如下:
– (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.events.count;
}
在我们的实现中,–tableView:numberOfRowsInSection:
我们可以确定字典中要使用的适当条目,如下所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//...
NSArray *pairs = [self.events pfx_keyValuePairsSortedByKeyUsingComparator:^(id obj1, id obj2) {
NSNumber *key1 = (NSNumber *)obj1;
NSNumber *key2 = (NSNumber *)obj2;
return [key1 compare:key2];
}];
NSUInteger index = [indexPath indexAtPosition:1];
PFXKeyValuePair *pair = pairs[index];
/*
At this point, pair.value will be a dictionary as in your output above
holding a value for the key @"Event" and a value for the key @"ID".
*/
//...
}
这可以通过创建pairs
一个属性并仅在必要时计算它来加快速度(例如,仅pairs
在重新加载表数据之前进行计算)。
注意:使用这种方法,字典仍然不会-writeToDisk:atomically:
“按顺序”序列化到磁盘(调用时),并且您的输出看起来仍然与您的问题相同。然而,这并不重要:当数据在表格视图中显示给用户时,数据将按照您的希望排序。