2012-01-25 63 views
0

我从服务器获取XML格式的数据并在场景中解析它。我有问题把这些数据放在使用NSMutableDictionary的键值对中。因为,NSMutableDictionary键是唯一的。因此,如果有相同的密钥来自xml,它将覆盖以前值存在的密钥。 例如:我的XML数据如下。iPhone:与NSMutableDictionary重复问题的重复

<?xml version='1.0' encoding='utf-8'?><order> 
      <number>123</number> 
      <detail> 

       <name>shoe</name> 
       <description>This is from nike</description> 
       <price>10.00</price> 

       <name>discount</name> 
       <description>This is from Arrow</description> 
       <price>-1.00</price> 

       <name>bag</name> 
       <description>This is a leather one</description> 
       <price>10.00</price> 

      </detail> 
      </order> 

[appDelegate.finalOrderDict setObject:trimmString forKey:elementName]; 

我试图把数据放到关键,使用的NSMutableDictionary,因为,我会显示类似下面另一种看法输出值对。

Summary: 
Shoe  $ 10.00 
Discount $ -1.00 
Bag  & 10.00 
Discount $ -2.00 

但是,由于密钥重复相同,它将覆盖现有数据。

如果数据中存在相同的键,并且我们试图将其放入NSDictionary中,有人可以帮助我解决键的重复情况。

谢谢!

回答

3

NSDictionary的行为与预期相同 - 当调用-setObject:forKey:时,如果旧密钥和新密钥对-isEqual:回答YES,则现有密钥值对将被覆盖。这听起来像你需要修改你的数据结构。

一个想法是将appDelegate.finalOrderDict改为NSDictionary对象的NSArray。然后,每个NSDictionary将具有“名称”和“价格”键值对。

你也有每个值提升到一个数组,如果它已经存在:

id existingValue = [appDelegate.finalOrderDict objectForKey:forKey:elementName]; 
if ([existingValue isKindOfClass:[NSMutableArray class]]) { 
    [existingValue addObject:trimmString]; 
} else if (existingValue) { 
    [appDelegate.finalOrderDict setObject:[NSMutableArray arrayWithObjects:existingValue, trimmedString, nil] forKey:elementName]; 
} else { 
    [appDelegate.finalOrderDict setObject:trimmedString forKey:elementName]; 
} 

这个方法是高风险的,但是,因为你必须键入检查从finalOrderDict获得的所有对象,看看他们是字符串或数组。