2013-10-23 87 views
0

我想分离数组中的元素。我有一个包含超过100000个NSNumber对象的NSArray。我的问题是,它们以3通过循环分组NSArray?

processarray = [[NSMutableArray alloc] init]; 

for (loopstart = 0; loopstart < arraycount; loopstart ++) 

{ 
    arrayvalue = [[mesharray objectAtIndex: loopstart] floatValue]; 
    coordinate = [NSNumber numberWithFloat: arrayvalue]; 
    [processarray addObject: coordinate]; 
    [printgcodetoconsole appendFormat: @"\nCOORDINATE: %@", coordinate]; 

} 

对于实例增量安排,我的数组是这样的:

  • 坐标:5567
  • 坐标:1065
  • 坐标:1564
  • 坐标:3432
  • 坐标:6123
  • 坐标:9345
  • 坐标:1856
  • 坐标:2765
  • 坐标:1998年
  • 坐标:9087
  • 坐标:2234
  • 坐标:5467

我需要的是一个将正确的值按照X,Y和Z分组在一起的方式,因为它们是空间上的点:

  • 新的Array对象:(X5567,Y1065,Z1564)

等等...

有物体之间没有相似性,除了它们都是NSNumber的对象在数组中。

在此先感谢!

我目前打印这个数组作为一个NSTextView字符串,我无法弄清楚如何不搞乱循环使用此代码字符串隔离:

[printgcodetoconsole appendFormat: @"\nCOORDINATE: %@", coordinate]; 

,我真的很喜欢的东西更像:

NSNumber * X; 
NSNumber * Y; 
NSNumber * Z; 

[printgcodetoconsole appendFormat: @"\n X%@, Y%@, Z%@", X, Y, Z]; 

回答

1

您应该检查时,计数器loopstart是3的倍数和组子阵列上的最后3个值:

NSMutableArray *subArray = [NSMutableArray array]; 
for (loopstart = 0; loopstart < arraycount; loopstart ++) { 
    arrayvalue = [[mesharray objectAtIndex:loopstart] floatValue]; 
    coordinate = [NSNumber numberWithFloat: arrayvalue]; 
    [subArray addObject:coordinate]; 
    if (loopstart % 3 == 0) { 
     [processarray addObject:subArray]; 
     subArray = [NSMutableArray array]; 
    } 
} 
+0

您好Jero!谢谢你的帮助。有没有办法通过分离X,Y和Z值来增加?我将这些字符串打印到像上面这样的NSTextView中... – Julian

+0

'(NSUInteger i = 0; i <[mesharray count]; i + = 3) NSString * coordinate = [NSString stringWithFormat:@“(X %,f%,%f)“,[[mesharray objectAtIndex:i] floatValue],[[mesharray objectAtIndex:(i + 1)] floatValue],[[mesharray objectAtIndex:(i + 2)] floatValue] ]。 [processarray addObject:coordinate]; }' – JeroValli

+1

JeroValli的评论会在它显示出来的时候显示出来。如果你想使用他的原始文章,并且如果原始数组中的坐标是正确的模式(即x,y,z,x,y,z),那么每个subArray自然应该是相同的模式:subArray [0 ]是X,subArray [1]是Y等等。你可以简单地说'[printgcodetoconsole appendFormat:@“\ n X%@,Y%@,Z%@”,subArray [0],subArray [1],subArray [2]];' – Nerrolken

0

这个简单的代码将从meshArray中取出每三个项目,将它们放入一个新的数组中,并将其插入一个更大的数组中(以便获得一个数组数组)。

NSArray *meshArray = /* obtain from somewhere */; 
NSAssert(([meshArray count] % 3) == 0, @"Array does not contain multiple of 3"); 

NSMutableArray coordinates = [NSMutableArray array]; 

for (NSUInteger i = 0; i < [meshArray count]; i += 3) 
    [coordinates addObject:[meshArray subarrayWithRange:NSMakeRange(i, 3)]]; 

或者,如果你愿意,你可以使用字典键入它们:

NSArray *meshArray = /* obtain from somewhere */; 
NSAssert(([meshArray count] % 3) == 0, @"Array does not contain multiple of 3"); 

NSMutableArray coordinates = [NSMutableArray array]; 

for (NSUInteger i = 0; i < [meshArray count]; i += 3) 
{ 
    NSDictionary *coordinate = @{ @"X" : meshArray[i], @"Y" : meshArray[i + 1], @"Z" : meshArray[i + 2] }; 
    [coordinates addObject:coordinate]; 
} 
+0

我一直得到相同的错误,数组数超出范围... – Julian

+0

这是不寻常的... NSAssert确保数组中有正确数量的元素,并且循环没有超出界限。您确定数组中元素的数量是3的倍数,并且您正在使用调试版本吗?你没有从多个线程访问这个数组? – dreamlax

+0

那就是问题所在。可能会有像垃圾0值这样的额外元素。这是一个解析的XML文件,所以这可能是它无法正常工作的原因。 – Julian

0

非常感谢球员...答案竟然是在JeroValli的有关使用模理念的变化。这是我可能补充的一个该死的性感主意。谢谢Jero和其他参与者。

for (loopstart = 0; loopstart < arraycount; loopstart ++) 

     { 
      arrayvalue = [[mesharray objectAtIndex: loopstart] floatValue]; 
      point = [NSNumber numberWithFloat: arrayvalue]; 
      [coordinates addObject: point]; 
      if (loopstart % 3 == 0) 
      { 
       [printgcodetoconsole appendFormat: @"\nCOORDINATE: X%@", point]; 
      } 
      else if (loopstart % 3 == 1) 
      { 
       [printgcodetoconsole appendFormat: @"\nCOORDINATE: Y%@", point]; 
      } 
      else if (loopstart % 3 == 2) 
      { 
       [printgcodetoconsole appendFormat: @"\nCOORDINATE: Z%@", point]; 
      }