16

What is an easy way to break an NSArray with 4000 objects in it into multiple arrays with 30 objects each?

So right now I have an NSArray *stuff where [stuff count] = 4133.

I want to make a new array that holds arrays of 30 objects. What is a good way to loop through, breaking *stuff into new 30-object arrays, and placing them inside of a larger array?

Obviously the last array won't have 30 in it (it will have the remainder) but I need to handle that correctly.

Make sense? Let me know if there is an efficient way to do this.

Ethan Allen
  • 14,425
  • 24
  • 101
  • 194

3 Answers3

51

Off the top of my head, something like (untested):

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;
}

The MIN(30, i) takes care of that last array that won't necessarily have 30 items in it.

Cœur
  • 37,241
  • 25
  • 195
  • 267
samvermette
  • 40,269
  • 27
  • 112
  • 144
4
            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];
            }
Oleh Kudinov
  • 2,533
  • 28
  • 30
-1

Converted the answer of @samvermette to 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;
        }
Tung Fam
  • 7,899
  • 4
  • 56
  • 63