我有一個由自定義類的對象組成的NSArray
。該類有3個(城市,州,郵編)字符串屬性。我想從array
獲得所有獨特的狀態值。iPhone - 從NSArray對象中獲取唯一值
我讀過NSPredicate
類,但在這種情況下無法使用它。我能找到的唯一例子就是字符串操作。
有人可以幫我嗎?
我有一個由自定義類的對象組成的NSArray
。該類有3個(城市,州,郵編)字符串屬性。我想從array
獲得所有獨特的狀態值。iPhone - 從NSArray對象中獲取唯一值
我讀過NSPredicate
類,但在這種情況下無法使用它。我能找到的唯一例子就是字符串操作。
有人可以幫我嗎?
的完全簡單一個襯裏:
NSSet *uniqueStates = [NSSet setWithArray:[myArrayOfCustomObjects valueForKey:@"state"]];
訣竅是NSArray
的valueForKey:
方法。這將迭代你的數組(myArrayOfCustomObjects
),在每個對象上調用-state
方法,並構建一個結果數組。然後我們創建一個NSSet
以及由此產生的狀態數組來刪除重複項。
與iOS 5和OS X 10.7開始,有一個新的類,它可以做到這一點,以及:NSOrderedSet
。有序集合的優點是它將刪除任何重複項,但也保持相對順序。
NSArray *states = [myArrayOfCustomObjects valueForKey:@"state"];
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:states];
NSSet *uniqueStates = [orderedSet set];
看看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"
注意:valueForKeyPath:@「@ distinctUnionOfObjects.PROPERTY」不保留排序順序。 – 2011-12-07 22:09:57
感謝@羅伯特阿爾特曼,指出了這一點。我想這節省了我一些調試時間 – Hulvej 2013-07-22 16:31:02
如果key的對象是一個數組並且它的第一個索引中存在該值,該怎麼辦? – 2014-01-28 21:44:36
雖然我也很喜歡@distinctUnionOfObjects的力量,因此,得到的答覆用戶probablyCorey了,這種簡潔的方式在這裏這個解決方案的益處是訂單保存。 – idStar 2016-01-29 18:56:41