Подтвердить что ты не робот

Что такое простой способ разбить NSArray с 4000+ объектами в нем на несколько массивов с 30 объектами каждый?

Что такое простой способ разбить NSArray с 4000 объектами в нем на несколько массивов с 30 объектами?

Итак, прямо сейчас у меня есть материал NSArray *, где [stuff count] = 4133.

Я хочу создать новый массив, содержащий массивы из 30 объектов. Что такое хороший способ прокрутки, разбиение * материала на новые массивы с 30 объектами и размещение их внутри большего массива?

Очевидно, что последний массив не будет содержать 30 (он будет содержать остаток), но мне нужно правильно это обработать.

Имеют смысл? Дайте мне знать, если есть эффективный способ сделать это.

4b9b3361

Ответ 1

Сверху моей головы, что-то вроде (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;
}

MIN(30, i) позаботится об этом последнем массиве, который не обязательно будет содержать 30 элементов.

Ответ 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];
            }

Ответ 3

Преобразовал ответ @samvermette на 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;
        }