【问题标题】:NSDictionary: Comparing NSDictionariesNSDictionary:比较 NSDictionaries
【发布时间】:2013-10-14 08:02:42
【问题描述】:

有两个文件。让我们称他们为fileOnefileTwo

每个都有几个具有相同名称的 NSMutableDictionary 属性。列举几个:

@property (retain, nonatomic) NSMutableDictionary * lunchStartTimeObject;
@property (retain, nonatomic) NSMutableDictionary * lunchLocationNameObject;
@property (retain, nonatomic) NSMutableDictionary * lunchLocationAddressObject;
@property (retain, nonatomic) NSMutableDictionary * activity1NameObject;
@property (retain, nonatomic) NSMutableDictionary * activity1StartTimeObject;
@property (retain, nonatomic) NSMutableDictionary * activity1LocationNameObject;
@property (retain, nonatomic) NSMutableDictionary * activity1CommentsFieldObject;
@property (retain, nonatomic) NSMutableDictionary * activity1LocationAddressObject;
@property (retain, nonatomic) NSMutableDictionary * activity2NameObject;
@property (retain, nonatomic) NSMutableDictionary * activity2StartTimeObject;
@property (retain, nonatomic) NSMutableDictionary * activity2LocationNameObject;
@property (retain, nonatomic) NSMutableDictionary * activity2CommentsFieldObject;
@property (retain, nonatomic) NSMutableDictionary * activity2LocationAddressObject;

我想通过调用以下方法(或类似方法)来比较两个文件中同名的字典:

-(NSMutableDictionary *)cellColorForChanges:(NSMutableDictionary *)newdictionary :(NSMutableDictionary *)oldDictionary;
{
    if(![newdictionary isEqualToDictionary:oldDictionary])
    {
        [newdictionary  setValue:@"UIColor yellowColor" forKey:@"cellColor"];
    }
    return newdictionary;
}

我试图避免手动为每个 NSMutableDictionary 编写代码。有没有办法避免以下情况:

if(![fileOne.lunchStartTimeObject isEqualToDictionary:fileTwo.lunchStartTimeObject])
{  
    fileOne.lunchStartTimeObject setValue:@"UIColor yellowColor" forKey:@"cellColor"]; 
}

我无法找出完成上述任务的最有效方法。是否有可能将每个字典发送到一个方法并取回字典(如果它不相等,则用另一个键更新)?或者我试图避免的是不可避免的?

【问题讨论】:

  • 好吧,你最终必须比较字典。值得庆幸的是, isEqualToDictionary 会进行逐项比较,因此您不必编写代码。当然,您可以通过将字典放入数组并编写代码来遍历数组并进行比较来避免一些额外的编码,而不必为每个字典编写单独的比较。但是,这在执行方面不会更“有效”。您也可以先比较散列值,知道不匹配的散列意味着不相等。但这只有在大多数不匹配时才会得到回报——你仍然需要比较以确保“相等”。

标签: objective-c data-structures nsmutablearray


【解决方案1】:

您遇到了这个问题,因为您没有充分抽象您的对象。在我看来,您上面的财产清单是荒谬的多余。即使您提供的简单代码代码也难以阅读。

尝试以更具概念性的方式思考您的问题。尝试考虑可以封装您正在寻找的功能的对象。

查看您的属性,您可能想要这样的类

@interface Activity : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSDate *startTime;
@property (nonatomic, strong) Location *location;

-(BOOL)isEqualToActivity:(Activity*)activity;

@end

也许您需要一个位置类来存储有关位置的更多信息;也许您可以使用更多字段,例如 firstName、lastName;也许你需要一个type(枚举或字符串)属性来告诉它是什么类型的活动等等——你明白了。

如前所述,您可以编写自己的比较方法,您可以在其中调整以允许或多或少严格的大写或小写字母、数字格式等。

【讨论】:

  • 感谢您的建议。我喜欢使用字典来存储文本和 detailText 信息并将它们存储到一个数组中。然后我将数组放在 sectionArray 中。接下来,我在 sectionArray 上枚举ObjectsUsingBlock,如果 array.count>1,我显示它们: cell.textLabel.text = [cellManagedObject valueForKey:@"text"]; cell.detailTextLabel.text = [cellManagedObject valueForKey:@"detailText"];我确信有更好的方法来实现这一点,但现在这对我有用。您是否有一种技术来显示基于用户提供的数据显示单元格的 UITableViewController?
  • 部分有时是空的;部分显示顺序更改;并非所有单元格都会有 cell.detailTextLabel.text。
  • 您在 cmets 中提出的问题(如何填充表格视图)完全不同。这是关于足够的数据源方法,而不是你如何设计你的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
相关资源
最近更新 更多