извлечь данные из NSMutableArray - PullRequest
0 голосов
/ 22 июля 2010

В моем приложении я анализирую xml, из которого я получаю список элементов (отелей и ресторанов), которые я помещаю в массив "listElements";Мне нужно получить из этого массива другой массив, который будет содержать только определенные элементы (только отели), а затем мне нужно получить из этого массива три массива, которые будут содержать отели по звездам (array5starhotel, array4starhotel, array3starhotel).Как это сделать?Вот код, который я использовал для разбора (я использовал TBXML):

- (void)loadCategories {
    // instantiate an array to hold categories objects
    listCategories = [[NSMutableArray alloc] initWithCapacity:100];

    tbxml = [[TBXML tbxmlWithXMLFile:@"Molise.xml"] retain];

    // Obtain root element
    TBXMLElement * root = tbxml.rootXMLElement;

    // if an author element was found
    if (root) {
      //search for the first category element within the root element's children
      TBXMLElement * category = [TBXML childElementNamed:@"category" parentElement:root];

      // if a category element was found
      while (category != nil) {

        // instantiate a category object
        Category * aCategory = [[Category alloc] init];

        // get the name attribute from the category element
        aCategory.name = [TBXML valueOfAttributeNamed:@"name" forElement:category];

        // search the category's child elements for a "element" element
        TBXMLElement * element = [TBXML childElementNamed:@"element" parentElement:category];

        // if a "element" element was found     
        while (element != nil) {                              

          // instantiate a "element" object
          Element * aElement = [[Element alloc] init];

          // extract the attributes from the "element" element
          aElement.title = [TBXML valueOfAttributeNamed:@"title" forElement:element];
          aElement.address = [TBXML valueOfAttributeNamed:@"address" forElement:element];          
          aElement.stars =[TBXML valueOfAttributeNamed:@"stars" forElement:element];

          // add the "element" object to the category's listElements array and release the resource       
          [aCategory.listElements addObject:aElement];
          [aElement release];

          // find the next sibling element named "element"
          element = [TBXML nextSiblingNamed:@"element" searchFromElement:element];
        }

        // add our category object to the listCategories array and release the resource  
        [listaCategories addObject:aCategory];
        [aCategory release];

        // find the next sibling element named "category"
        category = [TBXML nextSiblingNamed:@"category" searchFromElement:category];
      }                      

      [tbxml release];
    }

Ответы [ 2 ]

1 голос
/ 22 июля 2010

NSArray с [filteredArrayUsingPredicate:][1] - инструмент для работы.

Как уже отмечалось, ваш массив listCategories будет содержать массив объектов Category, каждая из которых содержит массив объектов Element.

// Retrieve "hotel" Elements 

NSPredicate *hotelPredicate = [NSPredicate predicateWithFormat:@"name == hotel"];
Category *hotelCategory = [[[listCategories filteredArrayUsingPredicate:hotelPredicate] objectAtIndex: 0] retain];

NSArray *hotels = [[hotelCategory listElements] retain];

// Split the array of Elements based on star value
NSPredicate *elementRatingTemplate = [NSPredicate predicateWithFormat:@"stars == $STARS"];

NSPredicate *threeStarPredicate = [elementRatingTemplate predicateWithSubstitutionVariables: [NSDictionary dictionaryWithObject:@"3" forKey:@"STARS"];

NSArray *threeStarHotels = [[hotels filteredArrayUsingPredicate: threeStarPredicate] retain]; 

NSPredicate *fourStarPredicate = [elementRatingTemplate predicateWithSubstitutionVariables: [NSDictionary dictionaryWithObject:@"4" forKey:@"STARS"];

NSArray *fourStarHotels = [[hotels filteredArrayUsingPredicate: fourStarPredicate] retain]; 

NSPredicate *fiveStarPredicate = [elementRatingTemplate predicateWithSubstitutionVariables: [NSDictionary dictionaryWithObject:@"5" forKey:@"STARS"];

NSArray *fiveStarHotels = [[hotels filteredArrayUsingPredicate: fiveStarPredicate] retain]; 

// Do something with the filtered arrays
// Clean up retained objects.
1 голос
/ 22 июля 2010

ОК, поэтому ваш фрагмент кода не выполняет то, о чем говорит вопрос.

Вы создаете массив категорий (listCategories), содержащий множество объектов Category.Каждый из них содержит массив listElements.

Предполагается, что вам нужны элементы из категории "отели".,.

// Get the hotels category
Category *hotelsCategory = nil;
for (Category *temp in listCategories.each) {
  if ([temp.name isEqualToString:@"hotel"]) {
    hotelsCategory = temp;
    break;
  }
}
if (nil == hotelsCategory)
  return NSLog(@"No hotels category found");

// Get the hotels from this category with a 3 or above star rating
NSMutableArray *array5starhotel = [NSMutableArray array];
NSMutableArray *array4starhotel = [NSMutableArray array];
NSMutableArray *array3starhotel = [NSMutableArray array];
for (Element *element in hotelsCategory.listElements) {
  if ([element.stars isEqualToString:@"5"])
    [array5starhotel addObject:element];
  if ([element.stars isEqualToString:@"4"])
    [array4starhotel addObject:element];
  if ([element.stars isEqualToString:@"3"])
    [array3starhotel addObject:element];
}

Надеюсь, это поможет - мне пришлось угадывать некоторые вещи, потому что я не знаю, что находится в объекте категории или элемента!

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