2014-11-14 69 views
1

我创建简单的类学生与性能NSSortDescriptor正确排序日期和字符串,这是自定义类的属性,但正确排序整数

@property (strong,nonatomic) NSString* firstname; 
@property (strong,nonatomic) NSString* lastname; 
@property (strong,nonatomic) NSDate* dateOfBirth; 
@property (assign,nonatomic) NSInteger index; 

在那之后,我创造了这个类的任何对象,给了它名字,姓氏,日期和索引,将它们全部添加到self.InitialStudentsArray。并开始按dateOfBirth排序:

NSSortDescriptor* descriptorDate=[[NSSortDescriptor alloc]initWithKey:@"dateOfBirth" ascending:YES]; 
NSArray* descArray=[NSArray arrayWithObjects:descriptorDate, nil]; 
[self.InitialStudentsArray sortUsingDescriptors:descArray]; 

所以,结果很奇怪。排序之前和排序之后的数组具有不同的项目顺序,但根本不按日期排序。

before sort (
    "46 Alex Dupel 25 10 1991", 
    "236 Ivan Evstegneev 20 09 1980", 
    "179 Hugo Igonin 03 02 1992", 
    "189 Alexey Boronenko 06 11 1978") 


after sort (
    "236 Ivan Evstegneev 20 09 1980", 
    "179 Hugo Igonin 03 02 1992", 
    "189 Alexey Boronenko 06 11 1978", 
    "46 Alex Dupel 25 10 1991") 

与名字和姓氏(即使使用选择同样的事情:

NSSortDescriptor* descriptorLastname=[[NSSortDescriptor alloc]initWithKey:@"lastname" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 

这只是财产“指标”,这是NSInteger的工作

我还做了什么。 ,我创建了一个只有student.dateOfBirth日期的数组,并且使用keyname self对它进行了排序,并且它可以工作!另一个实验 - 我创建了带有关键字“dateOfBirth”的字典数组,并按键名称@“dateOfBirth”对它进行了排序,并且它也起作用!

我知道其他方法live sortUsingComparator,但为什么这个方法不能在日期和字符串中的属性?


Upd 哦,伙计们,这是我的错误。我感谢你的所有答案,他们把我推到了哪里,在哪里搜索错误。当我发现它时,我感到非常惭愧。绝对愚蠢的错误。如果你有兴趣,我用这种方式来初始化学生:

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     self.firstname=[self getFirstname]; 
     self.lastname=[self getLastname]; 
     self.dateOfBirth=[self getDateOfBirth]; 
    } 
    return self; 
} 
-(NSString*) getFirstname {//some code...arrayOfFirstames...name=arc4random()...} 

即,我偶尔会重新定义设置属性的getter。三个全部。所以,当我每次使用新数值对数组进行排序时。 谢谢。

+0

它们似乎是按降序排序的firstname。如果您希望使用字符串比较来正确排序,则应该更改日期格式。而不是“DD MM YYYY”使用“YYYY MM DD”。 – 2014-11-14 19:03:17

+0

如果使用'[descriptorDate compareObject:self.InitialStudentsArray [0] toObject:self.InitialStudensArray [1]]',它会返回正确的值吗? – 2014-11-14 19:06:10

+0

@伊恩麦克唐纳,我试过了,它可能会返回正确的值,并可能返回不正确。喜欢它不依赖于项目。喜欢它取决于别的.. – NikLanf 2014-11-14 19:38:03

回答

0

你可能有错误的另一件事,SortDescriptors做工精细用绳子,这里一个例子:在控制台

NSArray *people = @[@{@"name": @"Ivan"},@{@"name": @"Hugo"},@{@"name": @"Alexey"},@{@"name": @"Alex"}]; 
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; 
NSArray *sorts = @[sort]; 
NSArray *orderedArray = [people sortedArrayUsingDescriptors:sorts]; 
NSLog(@"Show orderedArray: %@",[orderedArray description]); 

退出:

2014-11-14 20:19:45.377 pro[1366:60b] Show orderedArray: (
    { 
    name = Alex; 
}, 
    { 
    name = Alexey; 
}, 
    { 
    name = Hugo; 
}, 
    { 
    name = Ivan; 
} 
) 

我觉得it's好主意来记录你的阵列sortedArrayUsingDescriptor方法之前和之后。

嗨,再次。从来就再次做同样的,使用自定义类,这是头:

#import <Foundation/Foundation.h> 

@interface CustomClass : NSObject 

@property (nonatomic, strong) NSString *name; 

@end 

实施(.M)是空白的,并再次从来就完成:

CustomClass *ivan = [[CustomClass alloc] init]; 
ivan.name = @"Ivan"; 

CustomClass *hugo = [[CustomClass alloc] init]; 
hugo.name = @"Hugo"; 

CustomClass *alexey = [[CustomClass alloc] init]; 
alexey.name = @"Alexey"; 

CustomClass *alex = [[CustomClass alloc] init]; 
alex.name = @"Alex"; 


NSArray *people = @[ivan,hugo,alexey,alex]; 
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; 
NSArray *sorts = @[sort]; 
NSArray *orderedArray = [people sortedArrayUsingDescriptors:sorts]; 
NSLog(@"Show orderedArray:"); 
for (CustomClass *people in orderedArray) { 
    NSLog(@"%@\n",people.name); 
} 

再次,退出控制台是:

2014-11-14 22:38:13.297 pro[1406:147113] Show orderedArray: 
2014-11-14 22:38:13.298 pro[1406:147113] Alex 
2014-11-14 22:38:13.298 pro[1406:147113] Alexey 
2014-11-14 22:38:13.298 pro[1406:147113] Hugo 
2014-11-14 22:38:13.298 pro[1406:147113] Ivan 

sortDescriptors和属性没有任何问题。最佳

+0

我确认,在你的例子中,它可以很好地处理字符串,我写过关于它的内容 - 如果它是字典数组 - 没问题。但是如果字符串或日期是我自己的类的属性,并且数组由该类的对象组成,所以它不起作用。 – NikLanf 2014-11-14 19:41:36

+0

我确认这个功能也很好。 – 2014-11-14 21:42:51

+0

是的,它的工作!感谢您的代码。它有很多帮助。我更新帖子并告诉我错在哪里) – NikLanf 2014-11-15 00:41:33