2013-11-26 15 views
0

我有一个包含此对象的数组:合并内部阵列相同的对象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:事实上,你想改变给定的数组,而不是建立一个新的。

取决于你的意思是不同的,但因为它看起来像你的意思是比较内容而不是引用,你应该建立一个新的数组,以便如果比较为真,你增加计数,否则你添加对象。

变异现有阵列

免责声明:可能不是我最好的在这里工作。

我将不胜感激,如果有人可以建议如何改善这一点,因为我非常确定这不是最好的方法来做到这一点,甚至可能不工作(目前无法访问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在一段时间内,我应该说,可能会有一些最佳实践来实现平等比较而不是罗林摹自己完全像这个例子

+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);