Алгоритм: массив массивов в Cocoa Touch (возможно, с использованием NSCededSet) - PullRequest
3 голосов
/ 22 ноября 2008

Это немного утомительно с точки зрения объяснения, так что здесь идет. По сути, я заполняю tableView на iPhone несколькими разделами и, возможно, несколькими строками на раздел. Насколько я понимаю, лучше иметь массив массивов, так что вы можете просто определить, сколько разделов у вас есть, отправив сообщение в массив подсчета верхнего уровня, затем для строк на раздел, сделав то же самое для внутреннего массива (ов). ). Мои данные в виде словаря. Одна из пар ключ / значение в словаре определяет, где она будет отображаться в табличном представлении. Пример следующий:

{
  name: "bob",
  location: 3
}
{ 
  name: "jane",
  location: 50
}
{
  name: "chris",
  location: 3
}

В этом случае у меня будет массив с двумя подмассивами. Первый подмассив будет иметь два словаря, содержащих bob и chris, так как они оба являются частью местоположения 3. Второй подмассив будет содержать jane, поскольку она находится в местоположении 50. Какая моя лучшая ставка в Какао для заполнения этой структуры данных? Хеш-таблица в C, вероятно, сработает, но я бы лучше использовал классы, доступные в Cocoa.

Спасибо, пожалуйста, дайте мне знать, если мне нужно уточнить.

Ответы [ 3 ]

5 голосов
/ 22 ноября 2008

работает следующий код: ( edit: добавлен мой код инициализации)

NSArray * arrayOfRecords = [NSArray arrayWithObjects:

    [NSDictionary dictionaryWithObjectsAndKeys:
     @"bob", @"name",
      [NSNumber numberWithInt:3], @"location",  nil],

    [NSDictionary dictionaryWithObjectsAndKeys:
     @"jane", @"name",
      [NSNumber numberWithInt:50], @"location",  nil],

    [NSDictionary dictionaryWithObjectsAndKeys:
     @"chris", @"name",
      [NSNumber numberWithInt:3], @"location",  nil],

    nil];

NSMutableDictionary * sections = [NSMutableDictionary dictionary];

for (NSDictionary * record in arrayOfRecords)
{
    id key = [record valueForKey:@"location"];
    NSMutableArray * rows = [sections objectForKey:key];

    if (rows == nil)
    {
        [sections setObject:[NSMutableArray arrayWithObject:record] forKey:key];
    }
    else
    {
        [rows addObject:record];
    }
}

NSArray * sortedKeys = [[sections allKeys] sortedArrayUsingSelector:@selector(compare:)];
NSArray * sortedSections = [sections objectsForKeys:sortedKeys notFoundMarker:@""];

NSLog(@"%@", sortedSections);
3 голосов
/ 22 ноября 2008

И NSDictionary - это хеш-таблица.

0 голосов
/ 22 ноября 2008

В Какао лучше использовать объекты моделей, а не примитивные коллекции, особенно при использовании привязок. Словари, безусловно, должны быть объектами модели, и вы можете также превратить свои внутренние массивы в объекты модели. (Внешний массив должен оставаться массивом.)

Cocoa Touch не имеет привязок, но я нахожу (в Какао, поскольку я не программирую свой iPhone), что объекты модели облегчают понимание и работу. В любом случае, я рекомендую вам создавать модельные объекты.

(«Модель» относится к шаблону «Модель-Вид-Контроллер» Какао, в котором Какао предоставляет объекты представления и контроллера, а вы - модель).

...