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.
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.
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.
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 .
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.
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.
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];
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With