2013-10-23 88 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]; 
      }