0

我想将 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 中显示相同的顺序,我不知道怎么做?你能帮助我吗?

4

3 回答 3

1

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

于 2013-01-06T04:46:09.923 回答
1

如果我从您在评论中对@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

注意:在上面,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:“按顺序”序列化到磁盘(调用时),并且您的输出看起来仍然与您的问题相同。然而,这并不重要:当数据在表格视图中显示给用户时,数据将按照您的希望排序。

于 2013-01-06T20:02:34.130 回答
0

这是获取员工列表 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);
于 2015-10-29T07:07:29.730 回答