2011-07-27 4 views
13

¿Cuál es una manera fácil de dividir un NSArray con 4000 objetos en múltiples matrices con 30 objetos cada uno?¿Cuál es una manera fácil de romper un NSArray con más de 4000 objetos en múltiples matrices con 30 objetos cada uno?

Así que ahora tienen un NSArray * cosas donde [recuento cosas] = 4133.

que quieren hacer una nueva matriz que contiene las matrices de 30 objetos. ¿Cuál es una buena forma de recorrer, dividir * cosas en nuevas matrices de 30 objetos y ubicarlas dentro de una matriz más grande?

Obviamente, la última matriz no tendrá 30 (tendrá el resto) pero necesito manejarla correctamente.

¿Tiene sentido? Avíseme si hay una manera eficiente de hacer esto.

Respuesta

47

De la parte superior de mi cabeza, algo así (no probado):

NSMutableArray *arrayOfArrays = [NSMutableArray array]; 

int itemsRemaining = [stuff count]; 
int j = 0; 

while(itemsRemaining) { 
    NSRange range = NSMakeRange(j, MIN(30, itemsRemaining)); 
    NSArray *subarray = [stuff subarrayWithRange:range]; 
    [arrayOfArrays addObject:subarray]; 
    itemsRemaining-=range.length; 
    j+=range.length; 
} 

El MIN(30, i) se encarga de que la última serie que no necesariamente tiene 30 artículos en él.

+0

me gusta su acercamiento con el MIN (30, i). Muy limpio. Usaré esto, gracias! –

2
  NSMutableArray *arrayOfArrays = [NSMutableArray array]; 
      int batchSize = 30; 

      for(int j = 0; j < [stuff count]; j += batchSize) { 

       NSArray *subarray = [stuff subarrayWithRange:NSMakeRange(j, MIN(batchSize, [stuff count] - j))]; 
       [arrayOfArrays addObject:subarray]; 
      } 
-1

convirtió la respuesta de @samvermette a SWIFT 3

 var arrayOfArraySlices = [ArraySlice<CBOrder>]() // array of array slices 

     var itemsRemaining = orderArray.count 
     var j = 0 

     while itemsRemaining > 0 { 
      let range = NSRange(location: j, length: min(20, itemsRemaining)); 
      let arraySlice = orderArray[range.location..<range.location + range.length] 
      arrayOfArraySlices.append(arraySlice) 
      itemsRemaining -= range.length; 
      j += range.length; 
     } 
Cuestiones relacionadas