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"はソート順を保持しません。 –
@RobertAltmanに感謝しています。私はデバッグ時間を節約したと思います – Hulvej
キーのオブジェクトが配列で、その値が最初のインデックスに存在する場合はどうなりますか? –
ので、私も@distinctUnionOfObjectsのパワーのような、そして、回答ユーザーprobablyCoreyは、ここでは、このソリューションでは、この簡潔なアプローチに利益を与えたもののその順序が保持されているということです。 – idStar