Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 639
Ethan Allen Avatar asked Jul 27 '11 22:07

Ethan Allen


People also ask

What is the difference between NSArray and array?

Array is a struct, therefore it is a value type in Swift. NSArray is an immutable Objective C class, therefore it is a reference type in Swift and it is bridged to Array<AnyObject> . NSMutableArray is the mutable subclass of NSArray . Because foo changes the local value of a and bar changes the reference.

How do I create an NSArray in Objective C?

Creating NSArray Objects Using Array Literals In addition to the provided initializers, such as initWithObjects: , you can create an NSArray object using an array literal. In Objective-C, the compiler generates code that makes an underlying call to the init(objects:count:) method.

What is NSArray?

NSArray is an immutable Objective C class, therefore it is a reference type in Swift and it is bridged to Array<AnyObject> . NSMutableArray is the mutable subclass of NSArray .

What's a difference between NSArray and NSSet?

An NSSet is much like an NSArray, the only difference is that the objects it holds are not ordered. So when you retrieve them they may come back in any random order, based on how easy it is for the system to retrieve them.


2 Answers

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.

like image 109
samvermette Avatar answered Dec 01 '22 20:12

samvermette


            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];
            }
like image 34
Oleh Kudinov Avatar answered Dec 01 '22 19:12

Oleh Kudinov