Как объявить двумерную матрицу строкового типа в Objective C?

Похоже, вы должны использовать Collectors.collectingAndThen.

Сначала создайте экстракторы (при условии, что у ваших классов есть конструкторы и геттеры):

// The cast types are just an example. You can Cast/convert the array values to any type you want

IdName extractIdName(Object[] row) {
    return new IdName((String) row[0], (String) row[1], null);
}

Another extractAnother(Object[] row) {
    return new Another((String) row[2], (String) row[3], null);
}

Format extractFormat(Object[] row) {
    return new Format((String) row[4], (boolean) row[5], (boolean) row[6]);
}

Затем вам понадобятся функции слияния:

List<Another> setFormats(Map<Another, List<Format>> map) {
    return map.entrySet()
              .stream()
              .map(e -> {
                  e.getKey().setFormatList(e.getValue());
                  return e.getKey();
              })
              .collect(toList());
}

List<IdName> setAnothers(Map<IdName, List<Another>> map) {
    return map.entrySet()
              .stream()
              .map(entry -> {
                  entry.getKey().setAnotherNameList(entry.getValue());
                  return entry.getKey();
              })
              .collect(toList());
}

Наконец, это поможет. :

// Converting Object[][] to List<IdName>
List<IdName> list = 
      Arrays.stream(dbResult)
            .collect(
                collectingAndThen(
                    groupingBy(this::extractIdName,
                        collectingAndThen(
                            groupingBy(this::extractAnother,
                                mapping(this::extractFormat, toList())),
                            this::setFormats
                        )),                                                             
                    this::setAnothers));
25
задан Peter Mortensen 12 August 2011 в 15:11
поделиться

2 ответа

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

Для прямых объявлений, у Вас есть несколько опций. Если Вы хотите использовать NSArray, необходимо будет вручную создать структуру как это:

NSMutableArray *strings = [NSMutableArray array];
for(int i = 0; i < DESIRED_MAJOR_SIZE; i++)
{
    [strings addObject: [NSMutableArray arrayWithObject:@"" count:DESIRED_MINOR_SIZE]];
}

Или, с помощью литералов массивов, можно стать неизменными версия как это:

NSArray *strings = @[ @[ @"A", @"B", @"C" ], @[ @"D", @"E", @"F" ], @[ @"G", @"H", @"I" ] ]

можно тогда использовать его как это:

NSString *s = [[strings objectAtIndex:i] objectAtIndex:j];

Это несколько неудобно инициализировать, но это - способ пойти, если Вы хотите использовать методы NSArray.

альтернатива должна использовать массивы C:

NSString *strings[MAJOR_SIZE][MINOR_SIZE] = {0}; // all start as nil

И затем используют его как это:

NSString *s = strings[i][j];

Это является менее неловким, но необходимо стараться , сохраняют/копируют и значения выпуска , поскольку Вы вставляете их к и удаляете их из массива. (Если Вы не используете ARC, конечно!) NSArray сделал бы это для Вас, но с массивами C-стиля, необходимо сделать что-то вроде этого для замены массива:

[strings[i][j] release];
strings[i][j] = [newString retain];

другое различие - то, что можно поместить ноль в массив C-стиля, но не NSArrays - необходимо использовать NSNull для этого. Также смотрите на вопрос о Переполнении стека Какао: управление памятью с NSString для больше об управлении памятью NSString.

44
ответ дан Community 28 November 2019 в 18:32
поделиться

Если вы хотите объявить и инициализировать двумерный массив строк, вы можете сделать следующее:

NSArray *myArray = [NSArray arrayWithObjects:
                       [NSArray arrayWithObjects:@"item 1-1", @"item 1-2", nil],
                       [NSArray arrayWithObjects:@"item 2-1", @"item 2-2", nil],
                       [NSArray arrayWithObjects:@"item 3-1", @"item 3-2", nil],
                       [NSArray arrayWithObjects:@"item 4-1", @"item 4-2", nil],
                       nil];

Это дает вам неизменный массив.

12
ответ дан 28 November 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: