2013-01-06 61 views
0

我想轉換一個NSArray到NSDictionary中我使用IOS - 轉換NSArray的NSDictionary的到

- (NSDictionary *) indexKeyedDictionaryFromArray:(NSArray *)array 
{ 
    id objectInstance; 
    NSUInteger indexKey = 0; 

    NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init]; 
    for (objectInstance in array) 
     [mutableDictionary setObject:objectInstance forKey:[NSNumber numberWithUnsignedInt:indexKey++]]; 

    return (NSDictionary *)[mutableDictionary autorelease]; 
} 

輸出結果是:

{ 
    0 =  { 
     Event = ""; 
     ID = 1; }; 
    3 =  { 
     Event = ""; 
     ID = 77; }; 
    2 =  { 
     Event = ""; 
     ID = 23; }; 
    1 =  { 
     Event = ""; 
     ID = 45; }; 
    7 =  { 
     Event = ""; 
     ID = 10; }; 
    5 =  { 
     Event = ""; 
     ID = 26; }; 
    6 =  { 
Event = ""; 
     ID = 27; 
    }; 
    8 =  { 
Event = ""; 
     ID = 28; 
    }; 
} 

轉換爲NSDictionary中後,NSDictionary的ISN的順序不是真正的原始順序,我想在nsarray中顯示相同的順序,我不知道如何?你可以幫我嗎?

+2

爲什麼你需要一本字典?爲什麼不能使用數組的數組和索引作爲關鍵字?任何特定的原因? – iDev

+0

@ACB:因爲我需要在數組中替換null null – heaven

+0

字典對此有何幫助?你可以迭代數組並將其刪除? – iDev

回答

1

NSDictionary沒有訂單。對鍵進行排序並使用它們來訪問條目。

+0

我打算在UITableView中顯示順序,我不知道,你可以告訴我更多。謝謝 – heaven

1

如果我從您的回覆在評論@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 

:在上面的,PFXpfx是佔位符。你應該用適合你的項目的前綴代替它們。

然後,我們可以使用此類別方法來填充我們的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:時),序列化到磁盤,你的輸出看起來還是一樣在你的問題。但是,這並不重要:當數據在表格視圖中顯示給用戶時,數據將按照您希望的順序排列。

0

這是例如exmple之一獲得emplyee列表的NSMutableArray和創造的NSMutableDictionary .......

NSMutableArray *emloyees = [[NSMutableArray alloc]initWithObjects:@"saman",@"Ruchira",@"Rukshan",@"ishan",@"Harsha",@"Ghihan",@"Lakmali",@"Dasuni", nil]; 

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
for (NSString *word in emloyees) { 

NSString *firstLetter = [[word substringToIndex:1] uppercaseString]; 
letterList = [dict objectForKey:firstLetter]; 

if (!letterList) { 
    letterList = [NSMutableArray array]; 
    [dict setObject:letterList forKey:firstLetter]; 
} 

[letterList addObject:word];}NSLog(@"dic %@",dict);