2009-09-17 42 views
50

我有一個由自定義類的對象組成的NSArray。該類有3個(城市,州,郵編)字符串屬性。我想從array獲得所有獨特的狀態值。iPhone - 從NSArray對象中獲取唯一值

我讀過NSPredicate類,但在這種情況下無法使用它。我能找到的唯一例子就是字符串操作。

有人可以幫我嗎?

回答

117

的完全簡單一個襯裏:

NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]]; 

訣竅是NSArrayvalueForKey:方法。這將迭代你的數組(myArrayOfCustomObjects),在每個對象上調用-state方法,並構建一個結果數組。然後我們創建一個NSSet以及由此產生的狀態數組來刪除重複項。


與iOS 5和OS X 10.7開始,有一個新的類,它可以做到這一點,以及:NSOrderedSet。有序集合的優點是它將刪除任何重複項,但也保持相對順序。

NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"]; 
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states]; 
NSSet *uniqueStates = [orderedSet set]; 
+0

雖然我也很喜歡@distinctUnionOfObjects的力量,因此,得到的答覆用戶probablyCorey了,這種簡潔的方式在這裏這個解決方案的益處是訂單保存。 – idStar 2016-01-29 18:56:41

134

看看keypaths。他們超級強大,我大部分時間使用它們而不是NSPredicate類。這裏是你將如何在你的例子中使用它們...

NSArray *uniqueStates; 
uniqueStates = [customObjects valueForKeyPath:@"@distinctUnionOfObjects.state"]; 

的使用注意事項valueForKeyPath,而不是valueForKey的。

這裏是一個更詳細的/人爲的例子...

NSDictionary *arnold = [NSDictionary dictionaryWithObjectsAndKeys:@"arnold", @"name", @"california", @"state", nil]; 
NSDictionary *jimmy = [NSDictionary dictionaryWithObjectsAndKeys:@"jimmy", @"name", @"new york", @"state", nil]; 
NSDictionary *henry = [NSDictionary dictionaryWithObjectsAndKeys:@"henry", @"name", @"michigan", @"state", nil]; 
NSDictionary *woz = [NSDictionary dictionaryWithObjectsAndKeys:@"woz", @"name", @"california", @"state", nil]; 

NSArray *people = [NSArray arrayWithObjects:arnold, jimmy, henry, woz, nil]; 

NSLog(@"Unique States:\n %@", [people valueForKeyPath:@"@distinctUnionOfObjects.state"]); 

// OUTPUT 
// Unique States: 
// "california", 
// "michigan", 
// "new york" 
+17

注意:valueForKeyPath:@「@ distinctUnionOfObjects.PROPERTY」不保留排序順序。 – 2011-12-07 22:09:57

+0

感謝@羅伯特阿爾特曼,指出了這一點。我想這節省了我一些調試時間 – Hulvej 2013-07-22 16:31:02

+0

如果key的對象是一個數組並且它的第一個索引中存在該值,該怎麼辦? – 2014-01-28 21:44:36