4

編集:
文字列が繰り返される2つの異なる配列があり、一意の文字列のみで新しい配列を作成したいと考えています。

たとえば、次の 2 つの配列を使用します。

NSArray *array1 = [[NSArray alloc] initWithObjects:@"a",@"b",@"c",nil]; 
NSArray *array2 = [[NSArray alloc] initWithObjects:@"a",@"d",@"c",nil];

// Result should be an array with objects "b", and "d" 
// since they are the only two that are not repeated in the other array.
4

4 に答える 4

6

編集:

// Your starting arrays
NSArray *array1 = [[NSArray alloc] initWithObjects:@"a",@"b",@"c",nil]; 
NSArray *array2 = [[NSArray alloc] initWithObjects:@"a",@"d",@"c",nil];

// Create two new arrays that only contain the objects 
// which are not in the other array:
NSMutableArray *uniqueElementsInArray1 = [array1 mutableCopy];
[uniqueElementsInArray1 removeObjectsInArray:array2];

NSMutableArray *uniqueElementsInArray2 = [array2 mutableCopy];
[uniqueElementsInArray2 removeObjectsInArray:array1];

// Combine the two arrays.
// Result contains objects @"b" and @"d":
NSArray *result = [uniqueElementsInArray1 arrayByAddingObjectsFromArray:uniqueElementsInArray2];
于 2012-06-05T05:54:58.190 に答える
1

このためには、お互いに temp NSMutableArray を宣言するだけです。objectArray などの元の配列からデータを取得します。一時配列にそれがあるかどうかを確認し、一時配列に入れます。次のコードを参照してください。

    for(NSString *str in objectArray)
    {

        if(![tempArray containsObject:str])
        {

            [tempArray addObject:str];

        }
    }

この後、引き続き tempArray を使用するか、さらに objectArray を使用したい場合は tempArray を objectArray に入れることができます。これでうまくいくと思います。

于 2012-06-05T07:25:16.763 に答える
1

NSSet をフィルターとして使用できます (頭の中でベン図を考えてください)。

NSArray *array1 = @[@1,@2,@3,@4,@2,@3];
NSArray *array2 = @[@3,@4,@5,@6,@4,@6];

NSSet *set1 = [NSSet setWithArray:array1]; // [1,2,3,4]
NSSet *set2 = [NSSet setWithArray:array2]; // [3,4,5,6]
方法 1 (私のお気に入り):
NSMutableSet *mSet1 = [set1 mutableCopy];
NSMutableSet *mSet2 = [set2 mutableCopy];

[mSet1 minusSet:set2]; // mSet1 = [1,2]
[mSet2 minusSet:set1]; // mSet2 =  [5,6]

[mSet1 unionSet:mSet2]; // mSet1 = [1,2,5,6], only the unique elements.

// Now just put it in an immutable collections with a self-docu name...
NSArray *arrayOfUniqueness = [setOfUniqueElementsOnly allObjects];
方法 2 (より明示的なテスト、ベン図は不要):
NSSet *setOfObjsUniqueTo1 = [set1 objectsPassingTest:^BOOL(id  _Nonnull obj, BOOL * _Nonnull stop) {
    return ![set2 containsObject:obj];
}]; // [1,2]

NSSet *setOfObjsUniqueTo2 = [set2 objectsPassingTest:^BOOL(id  _Nonnull obj, BOOL * _Nonnull stop) {
    return ![set1 containsObject:obj];
}]; // [5,6]

NSMutableSet *oneSetToRuleThemAll = [NSMutableSet setWithSet:setOfObjsUniqueTo1];
// [1,2]
[oneSetToRuleThemAll unionSet:setOfObjsUniqueTo2]; // [1,2,5,6]

// Or as an array:
NSArray *anotherArrayOfUniqueness = [oneSetToRuleThemAll allObjects];
方法 3 (避けNSSetますが、正式な夕食会で英国女王の向かいにこのコードを座らせることはしません。エレガントではありません):
NSMutableArray *mArray1 = [NSMutableArray new];
NSMutableArray *mArray2 = [NSMutableArray new];

NSIndexSet *uniqueIndexes1 = [array1 indexesOfObjectsPassingTest:^BOOL(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    return ![array2 containsObject:obj];
}]; // [0,1,4] (b/c @1 and @2 are unique to array1)

[uniqueIndexes1 enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
    [mArray1 addObject:array1[idx]];
}]; // @[@1,@2,@2]

NSIndexSet *uniqueIndexes2 = [array2 indexesOfObjectsPassingTest:^BOOL(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    return ![array1 containsObject:obj];
}]; // [2,3,5] (b/c @5 and @6 are unique to array2)

[uniqueIndexes2 enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
    [mArray2 addObject:array2[idx]];
}]; // @[@5,@6,@6]

NSArray *unionArray = [array1 arrayByAddingObjectsFromArray:array2];
    // @[@1,@2,@2,@5,@6,@6]

NSArray *yetAnotherArrayOfUniqueness = [[NSSet setWithArray:unionArray] allObjects];
    // @[@1,@2,@5,@6]

質問者の質問ではありませんが、重複が削除された配列 (つまり、各要素が一意の場所) を取得するには、同様の魔法を実行できます。

//given...
NSArray *arr1 = @[@"a", @"b", @"c"];
NSArray *arr2 = @[@"b", @"c", @"d"];

//...make a single array to rule them all:
NSArray *temp = [arr1 arrayByAddingObjectsFromArray:arr2];
//[a,b,c,b,c,d]

//Make an NSSet from the two:
NSSet *filterSet = [NSSet setWithArray:temp]; // Set has: a,b,c,d

//Finally, transmogrify that NSSet into an NSArray:
NSArray *arrayOfUniqueness = [filterSet allObjects]; // [a,b,c,d]

Apple Docsに従って(強調を追加):

+setWithArray:特定の配列に含まれるオブジェクトの一意のコレクションを含むセットを作成して返します。

更新: 同様の質問については、こちらを参照してください: NSArray で重複するすべての文字列を削除する

于 2015-09-01T20:14:58.990 に答える
-2

Set をフィルターとして使用します。例:

String[] arr = {"a","a","b"};
Object[] uniqueArr = (Object[])new HashSet<String>(Arrays.asList(arr)).toArray();
于 2012-06-05T05:41:42.363 に答える