Objective C访问多维数组值

时间:2012-11-30 21:40:17

标签: objective-c arrays dictionary multidimensional-array

for(id key in stats) {
    NSLog(@"key=%@ value=%@", key, [stats objectForKey:key]);
}

我有一个数组字典,每个数组本身都有许多数组。它是字典中的多维数组。

但是上面的代码给出了以下内容

2012-11-30 21:36:07.203 key=main cat c value=(
"<Food: 0x6e5fb70>"
)
2012-11-30 21:36:07.205 key=main cat b value=(
"<Food: 0x6e5fa00>",
"<Food: 0x6e5faa0>"
)
2012-11-30 21:36:07.207 key=bakery_products value=(
"<Food: 0x6e5f510>",
"<Food: 0x6e5f660>",
"<Food: 0x6e5f700>",
"<Food: 0x6e5f810>",
"<Food: 0x6e5f900>",
"<Food: 0x6e5d5d0>"
)

如何访问那些显示为Food 0x6e5fb70的数组中的值?

我实际上已经使用了几个小时,但找不到解决方案。

3 个答案:

答案 0 :(得分:3)

或许这样的事情:

for (id key in [stats allKeys]) {
    NSArray *foodArray = [stats objectForKey:key];
    for (Food *food in foodArray) {
        // do stuff with Food object
    }
}

更新(对于Ploto的第2条评论):

你的意思是:

NSArray *array = [stats objectForKey:@"bakery_products"];

description更新#2:

- (NSString *)description {
    return [NSString stringWithFormat:@"Food: %@, %@", whatever1, whatever2];
}

答案 1 :(得分:0)

除了@rmaddy提到的,如果您使用Apple LLVM Compiler 4.0 +(我认为它带有xCode 4.4+),有一种简洁的方法可以做你需要的,没有样板代码,使用文字

以下是你将如何做到这一点:

for (id key in [stats allKeys]) {
    for (Food * food in stats[key]) {

        //this is the object you're looking for
        NSLog(@"Object: %@", food);

    }
}

其中stats是您的字典对象,其每个键都有一个数组。更新到LLVM 4.0只值得努力:)

如果您选择使用迭代器枚举每个数组,您甚至可以像这样访问对象:

stats[key][i]

答案 2 :(得分:0)

一种更有效的枚举字典的方法

[stats enumerateKeysAndObjectsUsingBlock:^(NSString *category, NSArray *foodItems, BOOL *stop) {
  for (Food *food in foodItems) {
    // do something with food
  }
}];

显然,如果你每次需要使用更长的东西时都需要以相同的顺序迭代字典

NSArray *sortedKeys = [[stats allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

for (id key in sortedKeys) {
  NSArray *foodArray = [stats objectForKey:key];
  for (Food *food in foodArray) {
    // do stuff with Food object
  }
}
相关问题