печать массива массивов в цели C - PullRequest
6 голосов
/ 31 января 2011

Извините за простой вопрос, но я самоучка и знаю, что в моем образовании есть пробелы.

Чтобы напечатать массив в цели C, я считаю:

NSLog(@"My array: %@", myArray);

Как я могу напечатать массив массивов?

Спасибо

Ответы [ 7 ]

10 голосов
/ 31 января 2011

Вы хотите это:

for(NSArray *subArray in myArray) {
    NSLog(@"Array in myArray: %@",subArray);
}

Это будет работать для массива, у которого массивы вложены на один уровень глубиной.

5 голосов
/ 31 января 2011

Вам не нужно делать что-то другое для записи массива массивов;код, точно такой, как вы написали, уже будет показывать содержимое вложенных массивов.

То есть следующая программа:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSMutableArray *array = [NSMutableArray array];

    for (int i=0; i<5; ++i) {
        NSMutableArray *sub = [NSMutableArray array];
        for (int j=0; j<=i; ++j) {
            [sub addObject:[NSString stringWithFormat:@"%d", j]];
        }
        [array addObject:sub];
    }

    NSLog(@"Array: %@", array);

    [pool drain];
    return 0;
}

Создает следующий вывод:

Array: (
        (
        0
    ),
        (
        0,
        1
    ),
        (
        0,
        1,
        2
    ),
        (
        0,
        1,
        2,
        3
    ),
        (
        0,
        1,
        2,
        3,
        4
    )
)

Понятно, что под-массивы уже хорошо регистрируются.Если вы хотите по-разному управлять форматированием, вам придется вручную их повторять, но по умолчанию -description NSArray немного больше, чем -description каждого объекта в этом массиве, который включает в себя все вложенные массивы.

2 голосов
/ 31 января 2011

Так что меня смутила вещь recursiveDescription, поэтому я написал свою собственную категорию в NSArray. Обратите внимание, что этот код выведет описание массива массивов на любую глубину. Само описание, вероятно, могло бы использовать немного больше форматирования, чем запятые и переводы строк. Вот, пожалуйста:

@interface NSArray (RecursiveDescription)
- (NSString *)recursiveDescription;
@end


@implementation NSArray (RecursiveDescription)

- (NSString *)recursiveDescription {
    NSMutableString *description = [[NSMutableString alloc] initWithString:@"Array (\n"];
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    for (NSObject *child in self) {
        if ([child respondsToSelector:@selector(recursiveDescription)]) {
            [description appendFormat:@"%@,\n", [child recursiveDescription]];
        }
        else {
            [description appendFormat:@"%@,\n", [child description]];
        }
    }
    [pool drain];
    [description appendString:@"\n)"];
    return [description autorelease];
}

@end
0 голосов
/ 09 июля 2015

Как бы мне ни нравилось, как легко выйти из объекта в Objective-C, мне не нравилось видеть двумерный массив в виде очень длинного списка.Я создал категорию на NSArray, которая распечатывает 2D-массивы.Он не идеален и может быть улучшен, но он работал для меня.

Заголовок:

@interface NSArray (Logging)

- (void)log2DArray;

@end

Реализация:

#import "NSArray+Logging.h"

@implementation NSArray (Logging)

- (void)log2DArray {
    NSMutableString *formattedString = [[NSMutableString alloc] init];
    NSInteger longestSubarrayLength = 0;
    for (NSArray *subarray in self) {
        if (subarray.count > longestSubarrayLength) {
            longestSubarrayLength = subarray.count;
        }
    }

    for (int i = 0; i < longestSubarrayLength; i++) {
        [formattedString appendFormat:@"\n"];

        for (int j = 0; j < self.count; j++) {
            NSArray *tempArray = [self objectAtIndex:j];
            if (tempArray.count <= longestSubarrayLength) {
                [formattedString appendFormat:@"%@\t", [tempArray objectAtIndex:i]];
            } else {
                [formattedString appendFormat:@"\t"];
            }
        }
    }

    NSLog(@"%@", formattedString);
}

@end

Использование:

[myArray log2DArray];
0 голосов
/ 31 января 2011

Более того, для печати всех элементов

int i = 0;
int j = 0;
for(NSArray *subArray in myArray) {
    NSLog(@"[%d] %@",i, subArray);

    j =0;
    for(NSObject *element in subArray) {
        NSLog(@"[%d:%d] %@", i,j,element);
        ++j;
    }
    ++i;
}
0 голосов
/ 31 января 2011

Или используйте recursiveDescription:)

NSLog(@"my arrays: %@", [myArray recursiveDescription]);
0 голосов
/ 31 января 2011

Попробуйте записать возвращаемое значение из метода NSArray -description.

NSLog(@"My array: %@", [myArray description]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...