2013-04-06 62 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