Разделить массив на многие динамически?Obj-C, - PullRequest
1 голос
/ 26 марта 2012

В настоящее время у меня есть этот метод:

-(void)seperateGuides
{
   DLog("GetGuideListCount: %i", [[appDelegate getGuideList] count]);

   columnOneArray = [[NSMutableArray alloc] init];
   columnTwoArray = [[NSMutableArray alloc] init];
   columnThreeArray = [[NSMutableArray alloc] init];

   for (int i = 0; i < [[appDelegate getGuideList] count]; i = i + 3) {
      [columnOneArray addObject:[[appDelegate getGuideList]objectAtIndex:i]];
   }

   for (int i = 1; i < [[appDelegate getGuideList] count]; i = i + 3) {
      [columnTwoArray addObject:[[appDelegate getGuideList]objectAtIndex:i]];
   }

   for (int i = 2; i < [[appDelegate getGuideList] count]; i = i + 3) {
      [columnThreeArray addObject:[[appDelegate getGuideList]objectAtIndex:i]];
   }
}

И мне нужно сделать это более динамичным, чтобы я мог определить, сколько массивов я хочу, а затем получить массивы.я собираюсь сделать из этого многомерный массив (хотя я не уверен, как с ним обращаться в Objectvie-C), или создать метод, который просто повторяет столько раз, сколько я определяю, проблема в том, что яЯ не совсем уверен, как получить различные массивы.

Был бы очень признателен за простой алгоритм или другое возможное решение.

Ответы [ 4 ]

3 голосов
/ 26 марта 2012

Алгоритм, который вы описываете, звучит эквивалентно тому, что мы делаем, когда мы раздаем колоду карт в несколько рук, поэтому я бы сделал это так:

- (NSArray *)dealObjects:(NSArray *)objects intoArrays:(NSInteger)numArrays
{
    NSMutableArray *arrays = [NSMutableArray arrayWithCapacity:numArrays];
    for (a = 0; a < numArrays; a++) {
        [arrays addObject:[NSMutableArray arrayWithCapacity:[objects count] / numArrays];
    }
    for (i = 0; i < [objects count]; i++) {
        [[arrays objectAtIndex:i % numArrays] addObject:[objects objectAtIndex:i]];
    }
    return arrays;
}
0 голосов
/ 26 марта 2012
-(void)seperateGuides
{
     NSMutableArray *parentArray = [[NSMutableArray alloc]init];

     int count =  [[appDelegate getGuideList] count];
     int TOTAL_COLUMNS = 3;//Define number of columns here
     for (int i = 0; i <count; i++)
     {
          int columnNo = i % TOTAL_COLUMNS;

          if(parentArray.count > columnNo)
          {
               NSMutableArray *innerArray = [parentArray objectAtIndex:columnNo];
               [innerArray addObject:[[appDelegate getGuideList]objectAtIndex:i]];
          }
          else
          {
               NSMutableArray *innerArray = [NSMutableArray arrayWithObject:[[appDelegate getGuideList]objectAtIndex:i]];
               [parentArray insertObject:innerArray atIndex:columnNo];
          }
     }
}

Надеюсь, это поможет ...

Здесь parentArray будет иметь NSMutableArray в качестве своих членов.Каждый массив представляет объекты в столбце.

0 голосов
/ 26 марта 2012

Довольно просто на самом деле.Просто добавьте новые объекты NSArray в корневой массив во время итерации по вашему набору данных.

- (void)seperateGuides {
    DLog("GetGuideListCount: %i", [[AppDelegate getGuideList] count]);

    NSArray *root = [[NSArray alloc] init];
    int dimensions = anyIntGreaterThanZero;

    for (int i = 0; i < dimensions; i += dimensions) {
        NSArray *branch = [[NSArray alloc] init];
        int k = 0;
        for (k += i; k < [[AppDelegate getGuideList] count]; k += dimensions) {
            [branch addObject:[[AppDelegate getGuideList] objectAtIndex:k]];
        }
        [root arrayByAddingObject:branch];
    }
}
0 голосов
/ 26 марта 2012

Вы можете добавить несколько массивов в другие массивы, как это,

-(void)seperateGuides:(int)columnCount
{


   rootArray=[[NSMutableArray alloc] init];
   for(int i=0;i<columnCount;i++)
   {
     column = [[NSMutableArray alloc] init];
     for(int j=i;j<[[appDelegate getGuideList] count];j=j+3)
     {

      [column addObject:[[appDelegate getGuideList]objectAtIndex:j]];
      [rootArray addObject:column];
      [column release];
     }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...