ios - 将NSArray转换为NSDictionary

时间:2013-01-06 04:40:21

标签: ios nsarray nsdictionary

我想将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的顺序不符合原始顺序,我想在nsarray中显示相同的顺序,我不知道怎么做?你能救我吗?

3 个答案:

答案 0 :(得分:1)

NSDictionary没有订单。对密钥进行排序并使用它们来访问条目。

答案 1 :(得分: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;

让我们假设表视图只有一个部分可以显示这些事件。

然后我们可以在–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:)“并且您的输出仍然与您的问题中的相同。但是,这并不重要:当在表视图中向用户显示数据时,数据将按照您的希望进行排序。

答案 2 :(得分:0)

这是示例之一,获取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);