2013-02-19 81 views
0
的陣列

您好我有字典的以下數組和,我想使用的關鍵「出生日期」的陣列進行排序和我的代碼如下分類詞典

NSLog(@"nodeEventArray == %@", temp); 
NSSortDescriptor *dateDescriptor = [NSSortDescriptor 
            sortDescriptorWithKey:@"BirthDate" 
            ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor]; 
NSArray *sortedEventArray = [temp 
          sortedArrayUsingDescriptors:sortDescriptors]; 
NSLog(@"sortedEventArray == %@", sortedEventArray); 

,但我無法正確地分類任何一個可以請告訴我如何根據「出生日期」鍵。自誕生之日起字典的數組排序即將作爲字符串從服務

字典的樣本數組:

nodeEventArray = (
     { 
     BirthDate = "05/04/1986"; 
     Email = ""; 
     FirstName = Test; 
     IsSpouse = 0; 
     LastName = Test; 
     MiddleInitial = ""; 
     PatientID = ""; 
     Phone = ""; 
     ScacntronCSVId = 40409; 
     SlotID = 1; 
     UserName = "Tes_02192013010055"; 
    }, 
     { 
     BirthDate = "02/14/1986"; 
     Email = ""; 
     FirstName = Guest; 
     IsSpouse = 0; 
     LastName = Guest; 
     MiddleInitial = ""; 
     PatientID = ""; 
     Phone = ""; 
     ScacntronCSVId = 40410; 
     SlotID = 2; 
     UserName = "Gue_02192013014725"; 
    }, 
     { 
     BirthDate = "02/17/1987"; 
     Email = ""; 
     FirstName = User; 
     IsSpouse = 0; 
     LastName = User; 
     MiddleInitial = ""; 
     PatientID = ""; 
     Phone = ""; 
     ScacntronCSVId = 40411; 
     SlotID = 3; 
     UserName = "Use_02192013020726"; 
    } 
    ) 
+0

也許這是你在找什麼:[如何排序一個NSMutableArray與自定義對象呢?](http://stackoverflow.com/questions/805547/how-to-sort-an-nsmutablearray-with-定製對象在它) – cacba 2013-02-19 07:50:38

+1

當你說「正確排序」你是什麼意思? 「BirthDate」只是一個字符串,因此它會按字母順序升序排列。 – Fogmeister 2013-02-19 07:50:43

+0

是啊,你爲什麼不使用'NSDate'來持有* BirthDate *? – trojanfoe 2013-02-19 07:53:48

回答

0

宏使用sortDescriptor的TEAD你可以用比較

NSArray *sortedArray = [nodeEventArray sortedArrayUsingComparator: ^(id obj1, id obj2) { 
     NSDateFormatter *dateFormator = [[NSDateFormatter alloc] init]; 
     NSDate *date1 = [dateFormator dateFromString:[[obj1 objectForKey:@"BirthDate"] stringByReplacingOccurrencesOfString:[[obj1 objectForKey:@"BirthDate"] lastPathComponent] withString:@"2013"]]; 
     NSDate *date2 = [dateFormator dateFromString:[[obj1 objectForKey:@"BirthDate"] stringByReplacingOccurrencesOfString:[[obj1 objectForKey:@"BirthDate"] lastPathComponent] withString:@"2013"]]; 
     if ([date1 earlierDate:date2] == date1) { 
      return (NSComparisonResult)NSOrderedDescending; 
     }else{ 
      return (NSComparisonResult)NSOrderedAscending; 
     } 

    }]; 
+0

工作正常,但需要升序和降序排序,但其工作上升只是不下降,需要與月份和日期排序不僅與年。 – user564963 2013-02-19 09:43:14

+0

我已根據您的要求修改了我的邏輯。此外,如果你交換NSOrderedAscending和NSOrderedDescending那麼你的排序將被顛倒 – 2013-02-19 12:55:55

+0

謝謝你的更新,我知道了它,並且升序和降序我使用如下所述if(dobSorted == YES){ //對於升序 返回[[df dateFromString:[dict1 objectForKey:@「BirthDate」]]比較:[df dateFromString:[dict2 objectForKey:@「BirthDate」]]]; }其他{ //對於Desending訂購 返回-1 * [[DF dateFromString:[dict1 objectForKey:@ 「出生日期」]]比較:[DF dateFromString:[dict2 objectForKey:@ 「出生日期」]]]; } – user564963 2013-02-19 13:39:13

1

我認爲將陣列從一個服務器或東西(因此「用戶名」位),但未來仍,這將是更好的存儲每個用戶/事件/無論在一個NSDate的對象。這樣,你可以按日期排序,它的工作原理。

但是,如果你想這個數組排序,然後...

如果您想通過出生日期進行排序(使用日期),那麼你就需要將字符串轉換成實際NSDates。

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
df.dateFormat = @"MM/dd/yyyy"; 

[blah sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) { 
    NSDate *date1 = [df dateFromString:[obj1 objectForKey:@"BirthDate"]; 
    NSDate *date2 = [df dateFromString:[obj2 objectForKey:@"BirthDate"]; 

    return [date1 compare:date2]; 
}]; 

這應該這樣做。

它會將字符串轉換爲日期,然後比較它們。

+1

他使用愚蠢的美國格式'MM/dd/yy',而不是優秀的英國格式'dd/MM/yy':D – trojanfoe 2013-02-19 08:00:54

+0

儘管我會鼓勵他使用'NSDate'來存儲日期,而不是暫時轉換爲它,這會帶來明顯的好處。 – trojanfoe 2013-02-19 08:03:14

+0

確實,我認爲數組來自服務器或某個東西(因此是「用戶名」位),但仍然最好將每個用戶存儲在具有NSDate的對象中。 – Fogmeister 2013-02-19 08:04:36