web-dev-qa-db-ja.com

iPhone-NSArrayオブジェクトから一意の値を取得する

カスタムクラスのオブジェクトで形成されたNSArrayがあります。このクラスには、3つの(都市、州、郵便番号)文字列プロパティがあります。 arrayからすべての一意の状態値を取得したいと思います。

NSPredicateクラスを読みましたが、この場合の使い方はあまりできませんでした。私が見つけることができた唯一の例は、文字列操作でした。

誰かが私を助けてくれますか?

55
lostInTransit

完全にシンプルなワンライナー:

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];
122
Dave DeLong

keypaths を見てください。それらは非常に強力であり、私はほとんどの場合NSPredicateクラスの代わりにそれらを使用します。あなたの例でそれらを使用する方法は次のとおりです...

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

valueForKeyの代わりにvalueForKeyPathを使用していることに注意してください。

以下に、より詳細な/工夫された例を示します...

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"
136
probablyCorey