2016-12-15 2 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)}, 
          ]; 

Я попытался с помощью NSCountedSet и countForObject, но результаты являются неточными. Кажется, что только массивы массивов точно совпадают. Другими словами, массив с @[@"Two",@"One"] игнорируется, потому что его не 100% равен @[@"One",@"Two"], хотя у них одинаковые объекты и одинаковые подсчеты.

ответ

-1

Может быть что-то вроде этого:

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]}]; 
} 

* Код не тестируется

+0

Пробовал, кажется, не работает ... Все еще получая дубликаты в массиве результатов –

0

Это должно работать. У вас должен быть последовательный способ сравнить ваши массивы (либо сортировки, как в этом примере, либо путем перемещения 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]}]; 
} 
Смежные вопросы