2010-07-21 56 views
5

我想數組排序會是這個樣子排序一個NSArray: (請忽略了一個事實,這些人早已過任何活的年齡我只是需要大量的!)由一個NSDictionary值

NSDictionary *person1 = [NSDictionary dictionaryWithObjectsAndKeys:@"sam",@"name",@"28.00",@"age",nil]; 
NSDictionary *person2 = [NSDictionary dictionaryWithObjectsAndKeys:@"cody",@"name",@"100.00",@"age",nil]; 
NSDictionary *person3 = [NSDictionary dictionaryWithObjectsAndKeys:@"marvin",@"name",@"299.00",@"age",nil]; 
NSDictionary *person4 = [NSDictionary dictionaryWithObjectsAndKeys:@"billy",@"name",@"0.0",@"age",nil]; 
NSDictionary *person5 = [NSDictionary dictionaryWithObjectsAndKeys:@"tammy",@"name",@"54.00",@"age",nil]; 

NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:person1,person2,person3,person4,person5,nil]; 

// before sort 
NSLog(@"%@",arr); 

NSSortDescriptor *ageSorter = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES]; 
[arr sortUsingDescriptors:[NSArray arrayWithObject:ageSorter]]; 

// after sort 
NSLog(@"%@",arr); 

現在擺在排序輸出將是:

2010-07-21 10:46:31.898 Sorting[70673:207] (
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

和排序後:

2010-07-21 10:46:31.900 Sorting[70673:207] (
    { 
    age = "0.0"; 
    name = billy; 
}, 
    { 
    age = "100.00"; 
    name = cody; 
}, 
    { 
    age = "28.00"; 
    name = sam; 
}, 
    { 
    age = "299.00"; 
    name = marvin; 
}, 
    { 
    age = "54.00"; 
    name = tammy; 
} 

正如你可以看到它不排序,但是從我的理解它是由字符串排序。我試過了,但是在嘗試編寫一個方法失敗幾天之後,我會對這個問題進行排序,但我仍然無所適從。什麼是最好的方法和完成這個,所以它按數值排序?

+0

何不你把年齡存儲爲數字嗎? [NSNumber numberWithFloat:28.0f]; – Gobra 2010-07-21 17:55:56

+0

因爲我使用的實際腳本是使用JSON拉動的,所以它以字符串對象的形式出現,否則我會:) – cdnicoll 2010-07-21 18:06:40

回答

10

雖然我質疑這裏使用的字符串,最簡單的方法來與數據工作與爲:

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

或者,使用Objective-C的更近的下標特點:

[array sortedArrayUsingComparator:^(NSDictionary *item1, NSDictionary *item2) { 
    return [item1[@"age"] compare:item2[@"age"] options:NSNumericSearch]; 
}]; 
+0

我不得不修改這個觸摸,但它的工作,謝謝! – cdnicoll 2010-07-21 18:40:45

0

最簡單的方法是將年齡存儲爲數字而不是字符串。

+0

請參閱我上面的註釋。它以一個JSON對象的形式出現,所以我不能完全將它作爲一個int值。 – cdnicoll 2010-07-21 18:07:24

相關問題