2011-04-03 77 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」。如果你們中的任何一個人看到任何問題或更好的實施,請告訴我。