私はObjective-Cが初めてなので、ご容赦ください。セット内で名前を繰り返すことができるという 1 つの条件を指定して、name=value のペアの配列 (またはセット) を作成する必要があります (したがって、NSMutableDictionary を使用できません)。ジレンマは、2 つの NSString オブジェクトをそれに追加する方法ですか?
4 に答える
辞書は引き続き使用できますが、値には配列またはセットを使用します。このようにして、同じキーを複数の異なる値にマップできます。
NSMutableDictionary
私はセットを使用しません。問題の根底にあるのはキーベースのルックアップであるため、引き続き使用する必要があると思います。
あなたがしたいことはNSMutableArray
、「値」として、名前をキーとして持つことです。キーがまだ使用されていない場合はNSMutableArray
、最初の値を使用してディクショナリ内に を作成します。キーが既に使用されている場合は、値をNSMutableArray
既に辞書内に追加するだけです。
「setValueForKey」メソッドのサンプル コードを次に示します。
NSMutableDictionary *dictionary = /* Some mutable dictionary stored as an instance variable or similar */
NSString *keyToAdd; id valueToAdd;
NSMutableArray *arrayForKey = [dictionary objectForKey:keyToAdd];
if (arrayForKey != nil) { // if the array has been created before earlier in the program
[arrayForKey addObject:valueToAdd]; // then just add the value directly to the array inside the dictionary
} else { // otherwise create the mutable array using the key
NSMutableArray *newMutableArray = [[NSMutableArray alloc] initWithCapacity:0];
[dictionary setObject:newMutableArray forKey:keyToAdd];
[newMutableArray addObject:valueToAdd];
}
このロジックを実装するには、技術的には のサブクラスを作成できますがNSDictionary
、カスタム ラッパー オブジェクトの方が意味的に優れていると思います。
セットはハッシュによる一意化を行うため、おそらく NSMutableSet も使用できません。同じハッシュを持つ 2 つのオブジェクトがある場合 (同じ文字を持つ 2 つの NSString など)、セット内の文字列も 1 つだけになります。
実際のオブジェクトを指すキー プロパティと値プロパティを持つオブジェクトを配置する NSMutableArray を使用することをお勧めします。または、値を NSArray に単独で保持することもできます。特定の値を探している場合は、配列を調べて、一致するキーを持つオブジェクトを取得できます。または、NSPredicate を使用してキーで配列をよりエレガントにフィルタリングします。
述語を使用して配列をフィルタリングする方法については、http: //www.cocoanetics.com/2010/03/filtering-fun-with-predicates/を参照してください。
NSDictionary はハッシュ マップされており、より高速であるため、NSDictionary を使用する必要があります。配列型のプロパティを持つカスタム クラスを作成できます。そこにすべての値を保存し、そのオブジェクトを値として使用してキーを配置します。