【问题标题】:The Idea? creating sorted array from NSDictionary key values (with objects)想法?从 NSDictionary 键值创建排序数组(带有对象)
【发布时间】:2013-08-06 22:53:06
【问题描述】:

我知道在 stackoverflow 中已经提出并回答了一大堆问题,这些问题涉及通过将 NSDictionary 中的键按数组中的排序顺序进行排序的挑战。我知道对象在实际字典中不是按排序顺序存储的,也就是说,我认为是出于效率的原因,或者可能是 Foundation 代码的内存管理。

我一直在尝试从这里以及苹果文档和博客中的几个答案中尝试示例(有些我可以开始工作,有些则不行!),但我似乎找不到解决我困惑的示例。

我认为我的困惑是我在这里遇到的例子,在苹果文档和不同有用的博客中,似乎都有只有一个键值对而第二个值不是对象的例子 -它更像是一个值。 (但它在某种程度上真的不是一个对象吗?我认为它是)

一个例子,我无法上班 (Sorting an NSArray by an NSDictionary value) 就是使用这个想法

   [array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) {
    NSString *age1 = [item1 objectForKey:@"age"];
    NSString *age2 = [item2 objectForKey:@"age"];
    return [age1 compare:age2 options:NSNumericSearch];
    }];

我想也许这个想法,以更具体的方式指定密钥,可能是我的问题。

我想知道我是否没有向编译器传达密钥是什么以及对象是什么,这就是为什么我收到“无法识别的选择器发送到实例”错误的原因。

.....代码片段跟随.....

1) 我有一个班级叫“狗”。一个给定的 dog 对象有几个属性,包括一个 NSString 键。

我的键是“licenseString”是一个字母数字键 - 我也想知道我是否应该使用 decimalNumberWithString 但这不是这里的问题

 @property (strong,nonatomic) NSString *licenseString;
  @property (strong, nonatomic) NSString *dogName;
 @property (strong, nonatomic) NSString *whatMakesDogSpecial;
 @property (strong, nonatomic) UIImage *dogPhoto;

2) 我有一个 NSDictionary @property (nonatomic, strong) NSDictionary *dogDictionary;

我以这种不太复杂的方式将信息硬编码到 dogDictionary 中,

 Dog *aDog;

// Dog one
aDog = [[Dog alloc]init] ;

aDog.licenseString     = @"1";
aDog.dogName   = @"Oscar";

aDog.whatMakesDogSpecial = @"This animal was found at the Mid-Penn humane society. He is super friendly, plays well with other dogs and likes people too. He enjoys fetching balls and frisbees too. He also goes to the park daily."   ;

aDog.dogPhoto   = [UIImage imageNamed:@"webVuMiniAppDogOscar.jpg"];

[self.dogDictionary setValue:aDog forKey:aDog.licenseString];

3) 然后,一旦我的 dogDictionary 中有几个狗对象,我想对许可证标签值进行排序,这样我就可以用狗名填充表格视图,但要按照它们的许可证标签的顺序。

顺便说一句,编译器似乎确实识别了下面代码片段中出现的“vars.dogDictionary”,因为当我查看调试器时,我可以看到我的狗字典中出现了两个有效实例。调试器输出在附件中

所以,我使用来自 stackoverflow 答案和苹果文档的想法,写了这个

 NSArray *sortedKeys = [vars.dogDictionary keysSortedByValueUsingComparator:
                       ^NSComparisonResult(id obj1, id obj2) {
                           return [obj1 compare:obj2];
                       }];


NSLog(@" The sorted array is %@", sortedKeys);

这就是我的问题发生的地方。我知道 0x1182f740 指的是“obj1”,如调试器附件所示

2013-08-06 15:13:58.276 SortDogLIcenseTags[3876:11303] -[Dog compare:]:无法识别的选择器发送到实例 0x1182f740 (lldb)

附件是显示调试器值的图片 - 他们不喜欢很好地粘贴

【问题讨论】:

  • 不是 Xcode 问题。 -- 至于实际问题:google 错误消息,“无法识别的选择器”是 Objective-C 程序可能崩溃的最常见(如果不是最常见)原因之一。基本上,您必须在 Dog 类上实现 compare:
  • 你想要一个排序的键数组(licenseStrings)吗?还是一组排序好的狗(按 licenseString 排序)?另外,vars 是什么?
  • 谢谢。当您说这不是 Xcode 问题时,我应该如何标记它? IOS?目标-C?我将尝试弄清楚如何在我的班级上实施比较。我想这就是我从各种来源使用的示例之间的区别吗?他们来自的班级已经有了? ....我在想我想要一个排序的键数组 - 许可证字符串,然后我会根据键从我的字典中选择狗对象,当我去填充用户选择的主表视图时。然而,一组排序好的狗可能也很适合知道如何做
  • 您应该对 NSString 值进行排序,而不是数组中的对象。此外,您的 NSString 和 NSDictionary 属性是错误的,它们需要是“复制”属性而不是“保留”,这是强默认的。
  • 顺便说一句,我没有在我的狗类上实现比较。我想要的排序数组是按键。对不起,我对 vars 的解释不清楚。 Vars 是指我保存所有应用程序数据的类,例如公司数据源。我再次知道这不是最复杂的方法。

标签: sorting nsdictionary selector


【解决方案1】:

我是这样解决这个挑战的。它可以工作并且很容易集成到我的主/细节项目中

我知道我在网上的某个地方找到了一个教程,让我找到了这个解决方案,很抱歉我现在找不到它。

注意 sortedDogDictionaryArray 和 dogDictionaryArray 在 .h 文件中被声明为属性。

self.dogDictionaryArray = [vars.dogDictionary allValues];
// Sort

NSSortDescriptor *sortDescriptorDog =
[[NSSortDescriptor alloc] initWithKey:@"licenseString" ascending:YES];
NSArray *sortDescriptorsDogs =
[NSArray arrayWithObject:sortDescriptorDog];


self.sortedDogDictionaryArray =
[self.dogDictionaryArray sortedArrayUsingDescriptors:sortDescriptorsDogs];
NSLog(@"%@",self.sortedDogDictionaryArray );

int doggie;
Dog *someDogName;
NSLog(@"Sorted Order is...");

for (doggie = 0; doggie < [self.sortedDogDictionaryArray count]; doggie++) {


    //NSLog(@"%@", [sortedArray objectAtIndex:i]);
    //NSLog(@"%@", [sortedArrayDogs objectAtIndex:doggie]);
    someDogName = [self.sortedDogDictionaryArray   objectAtIndex:doggie];
    //NSLog(@"name is %@", someDogName.dogName);
    NSLog(@"name is %@ tag is %@", someDogName.dogName, someDogName.licenseString);


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多