15

いくつかの共通要素を共有する 2 つの NSArrays A と B があります。

A: 1,2,3,4,5 
B: 4,5,6,7

要素の順序を維持し、重複を削除しながら、2 番目の NSArray のコンテンツと結合された 2 つの NSArray 間で共通のコンテンツで構成される新しい NSArray を作成したいと考えています。つまり、(A ∩ B) ∪ B が欲しいです。

以前の NSArray に対する操作は次のようになります。

A ∩ B: 4,5
(A ∩ B) ∪ B: 4,5,6,7

Objective-C でこれを達成するにはどうすればよいですか?

4

5 に答える 5

24

NSArraysをsに変換するNSSetと、標準のセット操作が使用可能になります。

NSArray *a = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
NSArray *b = [NSArray arrayWithObjects:@"4", @"5", @"6", @"7", nil];

NSMutableSet *setA = [NSMutableSet setWithArray:a];
NSSet *setB = [NSSet setWithArray:b];
[setA intersectSet:setB];
NSLog(@"c: %@", [setA allObjects]);

NSLog出力:c:(4、5)

[setA unionSet:setB];
NSLog(@"d: %@", [setA allObjects]);

NSLog出力:d:(6、4、7、5)

于 2011-09-30T22:00:01.693 に答える
15

他の人が示唆しているように、これは で簡単に行うことができますNSSet。ただし、これは順序を保持しません。

順序を維持したい場合で、OS X 10.7+ をターゲットにできる場合は、新しいNSOrderedSet(および変更可能なサブクラス) を使用して同じことを行うことができます。

于 2011-09-30T22:16:05.257 に答える
6

他の人が指摘しているように、NSSetを使用することによって。にとって

NSArray * a = [NSArray arrayWithObjects: ... ];
NSArray * b = [NSArray arratWithObjects: ... ];
NSMutableSet * set = [NSMutableSet setWithArray:a];
[set intersectSet:[NSSet setWithArray:b];
[set unionSet:[NSSet setWithArray:b];

これは重複を処理しますが、順序を保持しません。結果を「set」に入れて、配列に並べ替えます。すべてを実行するネイティブコレクション機能はありません。順序を維持し、重複を個別に心配する場合は、NSMutableArrayの-removeObjectsInArray:メソッドなどを使用してください。

于 2011-09-30T22:04:14.813 に答える
0

NSSetこれらの操作を実行するために使用できるクラスがあります。

于 2011-09-30T22:00:09.607 に答える