2016-12-15 8 views
2

この配列はどのように数えますか?多次元配列で数えます

NSArray *sortThisArray = @[@{@"numbers":@[@"One",@"Two"]}, 
           @{@"numbers":@[@"Two",@"One"]}, 
           @{@"numbers":@[@"One",@"Two",@"Three"]}, 
           @{@"numbers":@[@"One",@"Two",@"Three"]}, 
           @{@"numbers":@[@"One",@"Two",@"Three",@"Four"]}, 
           ]; 

望ましい結果は次のようになります。

NSArray *sortedArray = @[@{@"numbers":@[@"One",@"Two"], 
          @"occures":@(2)}, 

          @{@"numbers":@[@"One",@"Two",@"Three"], 
          @"occures":@(2)}, 

          @{@"numbers":@[@"One",@"Two",@"Three",@"Four"], 
          @"occures":@(1)}, 
          ]; 

私はNSCountedSetcountForObjectを使用して試してみたが、結果は不正確です。まったく同じ配列しか数えていないようです。つまり、@[@"Two",@"One"]の配列は、同じオブジェクトと同じ数を持っていても、@[@"One",@"Two"]と100%ではないため、無視されます。

NSMutableArray *mArray = [NSMutableArray arrayWithArray:sortThisArray]; 
NSMutableArray *result = [[NSMutableArray alloc] init]; 


while ([mArray count]) { 
    NSDictionary *obj = [mArray firstObject]; 
    int count = 1; 
    for (int i=1; i<[mArray count]; i++) { 
     NSDictionary *sObj = [mArray objectAtIndex:i]; 
     if ([[sObj objectForKey:@"numbers"] count] == [[obj objectForKey:@"numbers"] count]) { 
      BOOL increase = YES; 
      for (int j=0; j<[[obj objectForKey:@"numbers"] count]; j++) { 
       if (![[sObj objectForKey:@"numbers"] containsObject:[[obj objectForKey:@"numbers"] objectAtIndex:j]]) { 
        increase = NO; 
       } 
      } 
      if (increase) { 
       count++; 
       [mArray removeObjectAtIndex:i]; 
      } 
     } 
    } 
    [mArray removeObjectAtIndex:0]; 
    [result addObject:@{@"numbers":obj, @"occurrs":[NSNumber numberWithInteger:count]}]; 
} 

*コードは、これは動作するはず

答えて

-1

はこのようなものになる可能性があります。配列を比較する一貫した方法が必要です(この例のようにソートするか、NSArrayをNSSetに移動してください)。

NSMutableDictionary<NSArray<NSString *> *, NSNumber *> *valueCount = [NSMutableDictionary dictionary]; 
for (NSDictionary<NSString *, NSArray<NSString *> *> *value in sortThisArray) { 
    NSArray<NSString *> *numberStrings = [value[@"numbers"] sortedArrayUsingSelector:@selector(compare:)]; 
    valueCount[numberStrings] = @(valueCount[numberStrings].integerValue + 1); 
} 

NSMutableArray *sortedArray = [NSMutableArray arrayWithCapacity:valueCount.count]; 
for (NSArray<NSString *> *key in valueCount) { 
    [sortedArray addObject:@{@"numbers": key, @"occures": valueCount[key]}]; 
} 
+0

試してみましたが、動作していないようです...結果の配列に重複が残っています –

0

をテストされていません。