Реверсирование «столбцов» в таблице из NSArray - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть NSArray из чисел 1..50, который представляет таблицу со столбцами и строками.

Мне нужно изменить только порядок столбцов, сохраняя порядок строк. Так, например:

0,1,2,3,4,5,6
7,8,9,9,10,11,12

должно быть

6,5,4,3,2,1,0
12,11,10,9,8,7

Прямо сейчас я использую для этого огромный оператор IF:

for (dd *d in dates[i]) {
  if (tileNum==0) {
    reversedTileNum = 6;
  } else if (tileNum==1) {
    reversedTileNum = 5;
  }else if (tileNum==2) {
    reversedTileNum = 4;
  }else if (tileNum==3) {
    reversedTileNum = 3;
  }else if (tileNum==4) {
    reversedTileNum = 2;
  }else if (tileNum==5) {
    reversedTileNum = 1;
  } else if (tileNum==6) {
    reversedTileNum = 0;
  }
  ....
  .... 
}

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Вот решение, которое должно быть легко внедрено в любой проект.Он включает две категории: одну для NSMutableArray, которая предоставляет метод для обмена объектами с двумя индексами, и одну для NSArray, которая предоставляет метод -arrayByReversingGroups:.Идея состоит в том, чтобы поменять местами элементы в группе, полностью изменив группу.Если количество элементов в массиве не кратно groupSize, дополнительные элементы в конце остаются нетронутыми.

Код, представленный здесь, представляет собой законченную программу, поэтому вы можете увидеть пример использования -arrayByReversingGroups: в функции main().

#import <Foundation/Foundation.h>

@interface NSArray(Reversible)

-(NSArray*)arrayByReversingGroups:(int)groupSize;

@end

@interface NSMutableArray(Swappable)

-(void)swapObjectAtIndex:(int)first withObjectAtIndex:(int)second;

@end

@implementation NSArray(Reversible)

-(NSArray*)arrayByReversingGroups:(int)groupSize
{
    NSMutableArray *newArray = [self mutableCopy];
    // Iterate over the array in chunks of groupSize elements. i will be first index in
    // the current chunk.
    for (int i = 0; (i + groupSize) < [newArray count]; i += groupSize) {
        // Iterate over the items in the current chunk, swapping the bth and
        // (groupsize-b-1)th elements until they meet at groupsize/2.
        for (int b = 0; b <= (groupSize / 2); b++) {
            int first = i + b;
            int second = i + groupSize - b - 1;
            [newArray swapObjectAtIndex:first withObjectAtIndex:second];
        }
    }
    return [newArray copy];
}

@end

@implementation NSMutableArray(Swappable)
-(void)swapObjectAtIndex:(int)first withObjectAtIndex:(int)second
{
    id temp = [[self objectAtIndex:second] retain];
    [self replaceObjectAtIndex:second withObject:[self objectAtIndex:first]];
    [self replaceObjectAtIndex:first withObject:temp];
    [temp release];
}

@end

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        NSArray *array = [NSArray arrayWithObjects:
                          @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"12", nil];
        NSLog(@"Original: %@", array);
        NSLog(@"Reversed: %@", [array arrayByReversingGroups:5]);
    }
    return 0;
}
0 голосов
/ 25 ноября 2011

Я могу дать вам логику .. вам нужно будет написать код ... Сначала создайте функцию, в которой вы передадите массив (здесь вы отправите строку). Затем в этой функции создайте новый временный массиви сохраните все значения для этой строки в этом столбце, затем перезапишите исходный массив в обратном порядке из этого нового массива и верните его в полную матрицу и сохраните его там ... надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...