如何获取对象索引?

时间:2012-01-20 08:49:50

标签: iphone ios indexing nsmutablearray nsarray

如何获取对象索引?我有一个包含数组的字典,在数组中我有多个字典。

我的数据结构(例如):

  

学生------ 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);

有人可以帮忙吗?非常感谢你!

2 个答案:

答案 0 :(得分:2)

在您的代码中,您忘记了somedictsomearray的创建。可能存在问题。

此外,您不需要为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 */

答案 1 :(得分: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:方法,需要比较属性的值。
  • 上面的代码没有涵盖有很多具有相同价值的对象的情况(就像许多同名学生一样!)
  • ???

我希望我的“回答”能让您更轻松地实现您的需求。