2014-09-05 4 views
0

У меня есть массив с NSDictionary - 3 ключевых 3 значения, и мне нужно искать дубликаты объектов и сосчитать ихNSMutable поиск массива продублировать

  • первый ключ - чек (1/0)
  • второй ключ - масса (0 - 200)
  • и третий ключ - подход (1 - 6)
  • игнорировали - ключ проверки

Код:

NSMutableString *newtext = [[NSMutableString alloc] init]; 
NSMutableArray *original = [NSMutableArray arrayWithArray:[[_myExercise objectAtIndex:indexPath.row] objectForKey:@"myApproach"]]; 
NSMutableArray *myArr = [NSMutableArray arrayWithArray:[[_myExercise objectAtIndex:indexPath.row] objectForKey:@"myApproach"]]; 

for (int i = 0; i < [original count]; i ++) { 
    int count = 0; 
    for (int j = 0; j < [myArr count]; j ++) { 
     if ([original containsObject:[myArr objectAtIndex:i]]) { 
      count ++; 
      NSLog(@"нашед %d", count); 
      [original removeObjectAtIndex:0]; 
     } 
    } 

    NSLog(@"%@", original); 

    NSString *myStr = [NSString stringWithFormat:@"%d Х %@ Х %@", count, [[myArr objectAtIndex:i] objectForKey:@"repeat"], [[myArr objectAtIndex:i] objectForKey:@"weight"] ]; 
    [newtext appendString:myStr]; 
} 
+0

Непонятно, что вы пытаетесь сделать. Или то, что код пытается сделать. Для чего нужен индекс «j»? Почему вы всегда "[original removeObjectAtIndex: 0];" если исходный массив содержит объект: myArr objectAtIndex: i] (который всегда будет истинным, так как myArr должен иметь то же содержимое, что и оригинал). Этот код в основном просто удалит все из оригинала. – geowar

ответ

0

Если я предполагаю, что вы хотите myArr содержать исходный массив без дубликатов:

NSMutableString *newtext = [[NSMutableString alloc] init]; 
NSArray *original = _myExercise[indexPath.row][@"myApproach"]; 
NSMutableArray *myArr = [NSMutableArray array]; 

// iterate over the original 
for (int i = 0; i < [original count]; i++) { 
    int count = 0; 
    // iterate over the rest of the original 
    for (int j = i + 1; j < [original count]; j++) { 
     // if these items are equal… 
     if ([original[i] isEqualTo:original[j]]) { 
      count++; // bump the count 
      NSLog(@"нашед %d", count); 
     } 
    } 
    if (!count) { // if there were no dups… 
     [myArr addObject:original[i]]; // add the original item to myArr 
    } 
    NSLog(@"%@", original); 
    NSString *myStr = [NSString stringWithFormat:@"%d Х %@ Х %@", count, myArr[i][@"repeat"], myArr[i][@"weight"]]; 
    [newtext appendString:myStr]; 
} 
+0

Почему бы не положить его в набор, а затем обратно в массив? –

+0

JulianK: Я пытался свести к минимуму изменение кода, который он опубликовал. Вы должны написать это и опубликовать его в качестве ответа ... Я проголосую. ;-) – geowar

+0

.. Я так хочу что-то вроде LINQ будет в Objective-C в ближайшее время ... – cacau

1

Вот что вы можете сделать, создать новый словарь, который будет иметь в ключевой объект, который дублируется , а в значении - количество дубликатов:

NSMutableDictionary * newDict = [NSMutableDictionary dictionaryWithCapacity:[originalDict count]]; 
for(id item in [originalDict allValues]){ 
    NSArray * keys = [originalDict allKeysForObject:item]; 
    if([keys count] > 1) { 
     [newDict setObject:[NSNumber numberWithInteger:[keys count]] forKey:item]; 
    } 
} 
Смежные вопросы