2011-04-03 101 views
1

我对Objective-C非常陌生,并且没有很多C的经验,所以请原谅我的无知。我的问题是,是否可以添加一个数组到字典?以下是我在Python做的,这是非常方便的:包含NSArray的NSDictionary

if 'mykey' not in mydictionary: 
    mydictionary['mykey']=[] # init an empty list for 'mykey' 
mydictionary['mykey'].append('someitem') 

我想是这样的,即工作:

NSMutableDictionary *matchDict = [NSMutableDictionary dictionary]; 
NSMutableArray *matchArray = [NSMutableArray array]; 

while (blah): 
    [matchDict setObject: [matchArray addObject: myItem] forKey: myKey]; 

我没有运气到处看,刚想放弃。任何反馈将不胜感激!

回答

5

这和你在python中做的没有什么不同。

NSMutableDictionary *matchDict = ... 
NSMutableArray *matchArray = ... 
[matchDict setObject:matchArray forKey:someKey]; 
// This is same as: mydictionary['mykey']=[] 


// 'matchArray' is still a valid pointer so.. 
[matchArray addObject:someObj]; 

// or later if 'matchArray' were no longer in scope 
// it would look like this: 

NSMutableArray* arrayForKey = [matchDict objectForKey:someKey]; 
[arrayForKey addObject:someObj]; 

// or more simply: 
[[matchDict objectForKey:someKey] addObject:someObj]; 

// this is same as: mydictionary['mykey'].append('someitem') 

编辑

所以,如果你需要添加阵列为多个键,你可以这样做:

鉴于两个键的数组:

NSArray *keys = [NSArray arrayWithObjects:@"key0",@"key1", nil]; 

而且字典...

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:[keys count]]; 

这里是你如何可以为每个键创建磁盘阵列:

for (id key in keys) { 

    // Create a new array each time... 

    NSMutableArray *array = [NSMutableArray array]; 

    // and insert into dictionary as value for this key 

    [dict setObject:array forKey:key]; 
} 

希望,让你的想法。

+0

有道理。非常感谢Firoze! – Mohawke 2011-04-03 01:38:45

+0

如果Firoze的答案是你以后的,你应该接受它。 – 2011-04-03 01:41:53

+0

我试过这段代码,它确实添加了一个数组,但它不像Python那样。如果我有四个值,其中一个和两个其他值的关键字有两个键,我最终会得出结论:{1:['one','two','three','four'],2:[ 'one','two'}使用Python。以上将给我{1:['one','two','three','four'],2:['one','two','three','four']} Python使用键像过滤器一样追加。 – Mohawke 2011-04-03 02:07:03

1

这里是如何做到这一点:

[matchDict setObject:matchArray forKey:@"myKey"]; 

我不得不问自己this question 3个月前,所以不用担心要价太高;)

+0

谢谢!是的,在解决这个问题时遇到了一些麻烦。只是得到一个错误或一个空的字典。 – Mohawke 2011-04-04 21:28:58

+0

@Mohawke我们在这里发布的代码片段肯定可以工作,所以你的问题可能与代码的另一部分有关。如果您可以将它上传到某个地方,我会很乐意审查它并帮助您实现目标。 – antalkerekes 2011-04-04 21:45:05

+0

基本上我循环遍历文件系统并计算每个文件的MD5散列值。如果一个哈希匹配我有一个重复的文件。对于每个散列,我想追加匹配散列的文件路径,使散列成为键和匹配数组。[objective-c code](http://www.darkartistry.com/content/view/246/38/ )我是一名Python程序员,刚开始使用Objective-C并且在这之前没有太多问题。 [Python代码](http://www.darkartistry.com/content/view/242/41/)。我认为Python已经宠坏了我。我尝试了提供的例子,但它们不适合我。 – Mohawke 2011-04-04 22:47:56

0

想着它,我结束了之后解决问题。如果要动态填充每个键的数组,你做这样的:

While (something) 
{ 
    // check if key is already in dict. 
    if ([_matchesDictionary objectForKey: hashKey]) 
     { 
      // pull existing array from dict and add new entry to array for said key. 
      NSMutableArray *keyArray = [_matchesDictionary objectForKey: hashKey]; 
      [keyArray addObject: newPath]; 

      // put the array back into the dict for said key. 
      [_matchesDictionary setObject: keyArray forKey: hashKey]; 

    } else { 

      // create new array, assign empty array to said key in dict. 
      NSMutableArray *keyArray = [NSMutableArray array]; 
      [keyArray addObject: newPath]; 
      [_matchesDictionary setObject: keyArray forKey: hashKey]; 

    } 

} 

这将产生{(“值1”,值2' ,等...):‘somekey’}

感谢@Antal和@Firoze的所有帮助,您帮我解决了这个问题。只需要停止思考“Python”。如果你们中的任何一个人看到任何问题或更好的实施,请告诉我。