2012-01-20 2 views
1

Как я могу получить индекс объекта? У меня есть словарь, содержащий массивы, и внутри массивов у меня есть несколько словарей.Как получить индекс объекта?

Моя структура данных (например):

Студент ------ NSDictionary

Item 0 ------ NSArray<br> 
      Name ----- Grace<br> 
      Age ----- 20<br> 
    Item 1 ------ NSArray<br> 
      Name ----- Anne<br> 
      Age ----- 21<br>    

Так, например, у меня есть значение имени , Grace, и я хочу получить значение массива индекса объекта (в данном случае, пункт 0). Как я могу это сделать?

Я использовал indexOfObject, однако результаты, которые я получил, это 2147483647, что, я думаю, означает nsnotfound. Так что я думаю, что это не работает для этого случая.

Это мои коды:

NSMutableDictionary* namevalue = [[NSMutableDictionary alloc] init];  
namevalue = [somedict objectForKey:@"Name"];    
int arryindex; 
arryindex = [somearray indexOfObject:namevalue];     
NSLog(@"Array Index:%i", arryindex); 

Может кто-нибудь помочь? Спасибо огромное!

ответ

0

Если я правильно понял, вы ищете способ найти индекс объекта в NSDictionary на основе стоимости имущества этот объект имеет, правильно?
. Ваш students словарь имеет студент с именем Grace, и вы хотели бы знать, в какой индекс студент объект с именем Grace хранится ...

Если это верно, вот мой (неполное и грубое) решение, которое работает только для объектов с объектами NSString, но как только вы получите эту идею ниже, я думаю, вы сможете изменить код в соответствии с вашими потребностями.

- (NSInteger)indexOfObjectWithPropertyValue:(id)value inDictionary:(NSDictionary *)dict { 
    NSInteger objectIndex = 0; 
    unsigned int outCount, i; 

    for (id key in dict) { 
     id objForKey = [dict objectForKey:key]; 
     Class lender = [objForKey class]; 

     objc_property_t *properties = class_copyPropertyList(lender, &outCount); 

     for (i = 0; i < outCount; i++) { 
      objc_property_t property = properties[i]; 
      id v = [objForKey valueForKey:[NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding]]; 

      if ([v isKindOfClass:[value class]] && [v isEqual:value]) { 
       return objectIndex; 
      } 
     } 
     objectIndex++; 
    } 

    return NSNotFound; // i.e. NSIntegerMax 
} 

и не забудьте включить время выполнения заголовок:

#import <objc/runtime.h> 

Мой код может и, вероятно, есть некоторые вопросы:

  • самый очевидный isEqual: метод, который нужно сравнить свойства значения.
  • выше код не распространяется на ситуацию, когда существует много объектов с одинаковым значением (например, у многих студентов с одинаковым именем!)
  • ???

Надеюсь, мой «ответ» поможет вам реализовать то, что вам нужно.

+0

Спасибо за ответ (: я попробую коды вне (: – Grace

2

В вашем коде вы забыли включить создание somedict и somearray. Проблема может быть там.

Кроме того, вам не нужно назначать namevalue пустой словарь, а затем фактический словарь внутри массива.

Проверить этот фрагмент рабочего кода:

NSUInteger idx; 
NSDictionary *john = [NSDictionary dictionaryWithObjectsAndKeys:@"John", @"name", 
         [NSNumber numberWithInt:23], @"age", nil]; 
NSDictionary *jane = [NSDictionary dictionaryWithObjectsAndKeys:@"Jane", @"name", 
         [NSNumber numberWithInt:24], @"age", nil];  
NSArray *students = [NSArray arrayWithObjects:john, jane, nil]; 
idx = [students indexOfObject:john]; 
NSLog(@"john is at: %i", idx == NSNotFound ? -1 : idx); /* 0 */ 
idx = [students indexOfObject:jane]; 
NSLog(@"jane is at: %i", idx == NSNotFound ? -1 : idx); /* 1 */ 

Теперь попробуйте с объектом не присутствует в массиве:

NSDictionary *mary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mary", @"name", 
         [NSNumber numberWithInt:22], @"age", nil];   
idx = [students indexOfObject:mary]; 
NSLog(@"mary is at: %i", idx == NSNotFound ? -1 : idx); /* -1 Not found */ 

И, наконец, с новым объектом, но созданный как точная копия объект уже присутствует в массиве:

NSDictionary *maryjane = [NSDictionary dictionaryWithObjectsAndKeys:@"Jane", @"name", 
          [NSNumber numberWithInt:24], @"age", nil];    
idx = [students indexOfObject:maryjane]; 
NSLog(@"maryjane is at: %i", idx == NSNotFound ? -1 : idx); /* 1 */ 

метод indexOfObject ш плохое использование isEqual: для сравнения объектов. Вы можете убедиться в том, что новый объект будет считаться равным одному внутри массива:

NSLog(@"jane is maryjane? %i", [jane isEqual:maryjane]); /* 1 */ 
+0

Спасибо за ответ (: somedict - это словарь со значением в моих кодах. Я просто добавляю фрагмент важных кодов здесь (: я не знаю «namevalue» индексного массива, который я хочу найти, поскольку он соответствует пользовательский ввод. Вот почему я хочу знать, есть ли способ получить индекс объекта с помощью «namevalue» (: – Grace

Смежные вопросы