2013-11-26 3 views
0

У меня есть массив, который содержит это объекты:Merge одни и те же объекты внутри массива IOS

(
    { 
     aOptns =    (
     ); 
     fCustomDscnt = 0; 
     fPrcntDscnt = 0; 
     fPrice = 0; 
     fQty = 1; 
     iItemDayPriceId = 143; 
     iShiftId = 1; 
     sItemName = ""; 
     sModifier = ""; 
    }, 
    { 
     aOptns =    (
     ); 
     fCustomDscnt = 0; 
     fPrcntDscnt = 0; 
     fPrice = 0; 
     fQty = 1; 
     iItemDayPriceId = 143; 
     iShiftId = 1; 
     sItemName = ""; 
     sModifier = ""; 
    }, 
    { 
     aOptns =    (
     ); 
     fCustomDscnt = 0; 
     fPrcntDscnt = 0; 
     fPrice = 0; 
     fQty = 1; 
     iItemDayPriceId = 143; 
     iShiftId = 1; 
     sItemName = ""; 
     sModifier = ""; 
    }, 
    { 
     aOptns =    (
     ); 
     fCustomDscnt = 0; 
     fPrcntDscnt = 0; 
     fPrice = 0; 
     fQty = 1; 
     iItemDayPriceId = 112; 
     iShiftId = 1; 
     sItemName = ""; 
     sModifier = ""; 
    } 
) 

мне нужно объединить содержимое массива, если объекты являются одинаковыми и модифицировать объект внутри этого массива таким образом, что это должно быть так:

(
     { 
      aOptns =    (
      ); 
      fCustomDscnt = 0; 
      fPrcntDscnt = 0; 
      fPrice = 0; 
      fQty = 3; 
      iItemDayPriceId = 143; 
      iShiftId = 1; 
      sItemName = ""; 
      sModifier = ""; 
     }, 

     { 
      aOptns =    (
      ); 
      fCustomDscnt = 0; 
      fPrcntDscnt = 0; 
      fPrice = 0; 
      fQty = 1; 
      iItemDayPriceId = 112; 
      iShiftId = 1; 
      sItemName = ""; 
      sModifier = ""; 
     } 
    ) 

Как вы можете видеть, вход для объекта с iItemDayPriceId = 143 становится 1 только с fQty = 3.

Я попытался с помощью кода здесь: How to Find Duplicate Values in Arrays?

Но это только сравнение по 2 предмета за раз.

ответ

0

Редактировать: К сожалению, я пропустил ваше требование к счету.

Редактировать 2: И тот факт, что вы хотите изменить данный массив, а не построить новый.

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

Mutate существующий массив

Отказ от ответственности: вероятно, не моя лучшая работа здесь.

Я был бы признателен, если бы кто-нибудь мог предложить, как улучшить это, потому что я уверен, что это не лучший способ сделать это и, возможно, даже не работать (не иметь доступа к компилятору Obj-C на данный момент) ,

Foo objectA = [Foo new]; 
objectA.Bar = @"Bar"; 
Foo objectB = [Foo new]; 
objectB.Bar = @"Bar"; 
Foo objectC = [Foo new]; 
objectC.Bar = @"Not Bar"; 

NSMutableArray *array = @[objectA, objectB, objectC]; 

NSMutableDictionary *countDictionary = [[NSMutableDictionary alloc] init]; 

for (Foo *foo in [array copy]) 
{ 
    bool found = false; 

    for (Foo *key in countDictionary) 
    { 
     if ([key isEqualTo:foo]) 
     { 
      NSNumber *currentCount = [countDictionary objectForKey:key]; 
      int currentIntCount = [currentCount intValue]; 
      currentIntCount++; 
      [countDictionary setObject:[NSNumber numberWithInt:currentIntCount] forKey:key]; 

      [array removeObject:key]; 

      found = true; 

      break; 
     } 

     if (!found) 
      [countDictionary setObject:[NSNumber numberWithInt:1] forKey:foo]; 
    } 
} 

for (Foo *realFoo in array) 
{ 
    NSNumber *countNumber = [countDictionary objectForKey:realFoo]; 
    int countInt = [countNumber intValue]; 

    realFoo.Count = countInt; 
} 

Построить новый массив

Foo objectA = [Foo new]; 
objectA.Bar = @"Bar"; 
Foo objectB = [Foo new]; 
objectB.Bar = @"Bar"; 

NSMutableArray *array = @[objectA, objectB]; 
NSMutableArray *distinct = [[NSMutableArray alloc] init]; 

for (Foo *f in array) 
{ 
    bool found = false; 
    for (Foo *d in distinct) 
    { 
     if ([d isEqualTo:f]) 
     {    
      found = true; 
      d.Count++; 
     } 
     break; 
    } 

    if (!found) 
     [distinct addObject:f]; 
} 

И, конечно, вы бы определить компаратор равенство для Foo с, в этом случае, например

-(bool) isEqualTo:(Foo *)nFoo 
{ 
    bool isEqual = false; 

    if ([self.Bar isEqualToString:nFoo.Bar]) 
     isEqual = true; 

    return isEqual; 
} 

После не рассматривается Задача C в то время я должен сказать, что могут быть некоторые лучшие практики в отношении реализации сравнения равенства вместо rollin г ваш собственный полностью как в этом примере

+0

спасибо! Я решил свою проблему с вашей помощью! :) –

+0

Нет проблем, но на самом деле не совсем - ваше требование состояло в том, чтобы мутировать данный массив, а не создавать новый. Я пересматриваю свой ответ, чтобы сделать это, хотя я не уверен, что это желательно –

0

Использование ниже код:

NSMutableArray* myArray = 
[[NSMutableArray alloc]initWithObjects: 
@"red",@"blue",@"red",@"green",@"yellow", @"33", @"33",@"red", @"123", @"123",nil]; 

NSOrderedSet *mySet = [[NSOrderedSet alloc] initWithArray:myArray]; 
myArray = [[NSMutableArray alloc] initWithArray:[mySet array]]; 

NSLog(@"%@",myArray); 
Смежные вопросы