2013-04-06 80 views
2

混淆!!!對NSMutableDictionary的排序

我有一個NSMutableDictionarytempDict,有運費,燃料,折扣(還有更多)相關

我生成兩個不同NSMutableArrays使用此代碼調用從tempDictarrTVBuyChargearrTVBuyCost

[arrTVBuyCharge addObjectsFromArray:[(NSArray *)[tempDict allKeys]]]; 
[arrTVBuyCost addObjectsFromArray:[(NSArray *)[tempDict allValues]]]; 

問題:我想在頂部在同一順序執行上述陣列運費,燃料和折扣 (當然,訂購)。

什麼是實現此目的的最佳方法?

回答

1

1)分別獲取三個對象:

NSArray *mainKeys = @[@"Freight", @"Fuel", @"Discount"]; 
NSArray *mainValues = @[[tempDict valueForKey:@"Freight"], 
     [tempDict valueForKey:@"Fuel"], 
     [tempDict valueForKey:@"Discount"] 
     ]; 
[arrTVBuyCharge addObjectsFromArray:mainKeys]; 
[arrTVBuyCost addObjectsFromArray:mainValues]; 

2)從tempDict刪除它們:

[tempDict removeObjectsForKeys:mainKeys]; 

3)從更新tempDict添加的對象

[arrTVBuyCharge addObjectsFromArray:(NSArray *)[tempDict allKeys]]; [arrTVBuyCost addObjectsFromArray:(NSArray *)[tempDict allValues]]; 

這將使運費,燃料和折扣在您的新陣列中的索引0,1和2

+0

我會和你的答案一起,因爲它是最適合我的代碼的情況。我編輯了你的答案以消除崩潰。 – Bhavin 2013-04-08 07:42:08

+0

很高興幫助:) – 2013-04-14 12:58:13

1

人,的NSMutableDictionary總是返回鍵無序的方式,如果你真的想維持秩序,那麼你可以按字母順序進行排序,或者你可以在你的價值觀前加01,02,03序列號,以他們在整理爲了將它們放在後面,稍後修剪字符串的前兩個字符並使用它。

+0

來吧,我知道「NSMutableDictionary總是以無序的方式返回鍵」。這就是爲什麼我問這個問題。我知道我無法排序NSMutableDictionary。那麼解決它的最好方法是什麼? – Bhavin 2013-04-06 14:29:21

+0

是的,我告訴你可以添加序列號或其他東西,而你填充數組,然後使用[anArray sortedArrayUsingSelector: @selector(localizedCaseInsensitiveCompare :)]將它們排序。我有類似的問題,所以我也這樣做了。我將01.值,02.值添加到我的數組中,然後對其進行排序。當我想要使用數組內容時,我使用subsStringFromIndex:3 – satheeshwaran 2013-04-06 14:32:50

+0

我正在考慮您的解決方案。 – Bhavin 2013-04-06 14:34:53

3

起初看起來很棘手,但當你考慮它時很簡單。所有你想要做的就是得到一個有序鍵列表,並且在你將它們添加到你的數組中時查找每個鍵的值。

爲了得到一個數組排序鍵列表:

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

然後通過這些迭代,並將它們添加到NSMutableArrays:

NSMutableArray *arrTVBuyCharge = [[NSMutableArray alloc] init]; 
NSMutableArray *arrTVBuyCost = [[NSMutableArray alloc] init]; 
for (NSString *key in sortedKeys) { 
    [arrTVBuyCharge addObject:key]; 
    [arrTVBuyCost addObject:[tempDict objectForKey:key]]; 
} 

爲了更好的性能,使用initWithCapacity方法爲NSMutableArrays,因爲你知道大小。

這是執行此操作的標準方法。

+1

_ + 1_這絕對是做到這一點的方法。如果你需要排序的值,使用'-keysSortedByValueUsingSelector:'。 – Tricertops 2013-04-06 15:22:49

+0

謝謝Marcus。我只想知道你的解決方案比satheeshwaran的答案更好。他的答案中沒有循環。 – Bhavin 2013-04-08 06:38:56

+0

@iMartin,是您添加值的順序與您希望它們排序的順序相同,您將需要satheshwaran的解決方案工作嗎?如果是這樣,那麼只需使用數組,而不是字典。我沒有發明這個解決方案。你幾乎可以在任何關於NSDictionary的教程中找到它。這是標準的方式。這很簡單。你不需要for循環,取決於你對數據做什麼。 – 2013-04-08 07:14:58

相關問題