如果我從您的回覆在評論@ACB和@Zaph正確認識,要做到以下幾點:
保持一個集合映射整數鍵對象,它是由按鍵有序值。
如果我的理解正確,數組將不足以達到您的目的,因爲數組中的整數鍵不允許出現「漏洞」。但是,您需要考慮漏洞:在問題的輸出中,缺少4的鍵值對。出於這個原因,字典對你很有吸引力。
不幸的是,字典將不允許你保持它包含的鍵值對的排序,正如@Zaph指出的那樣。然而,你說,你只是想顯示在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;
而且讓我們假設表視圖只有一個部分顯示這些事件。
然後我們就可以在我們的UITableViewController
子類中實現–tableView:numberOfRowsInSection:
如下:
– (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
作爲屬性並在必要時僅計算它可以使速度更快(例如,在重新加載表的d之前僅計算pairs
ATA)。
注意:使用這種方法,字典仍然不會「按順序」(呼叫-writeToDisk:atomically:
時),序列化到磁盤,你的輸出看起來還是一樣在你的問題。但是,這並不重要:當數據在表格視圖中顯示給用戶時,數據將按照您希望的順序排列。
爲什麼你需要一本字典?爲什麼不能使用數組的數組和索引作爲關鍵字?任何特定的原因? – iDev
@ACB:因爲我需要在數組中替換null null – heaven
字典對此有何幫助?你可以迭代數組並將其刪除? – iDev