获取数组中对象的索引以查找其他数组中的对应对象

时间:2011-06-18 03:06:49

标签: iphone objective-c ios arrays cocoa-touch

我有两个数组。一个是名称数组,另一个是由标题为“是”或“否”的字符串组成的数组。 “name”数组中每个名称的索引路径对应于“Yes / No”数组中的相同索引路径。例如:

Names Array | Yes/No Array
Person 1    | Yes
Person 2    | No
Person 3    | Yes

查找某个人姓名的最简单方法是什么(可能是获取它的索引路径)并检查“是/否”数组中是“是”还是“否”?

另外,我不确定“索引路径”是否是正确的术语。如果不是,我的意思是对象在数组中的数字。

4 个答案:

答案 0 :(得分:31)

NSArray有一个名为indexOfObject的方法,如果找不到这样的对象,它将返回其对应的数组值等于anObject的最低索引或NSNotFound。如果您的名称数组未排序,则使用此数组获取您可以插入Yes / No数组的索引。也就是说,沿着这些方向:

NSString *answer = nil;
NSUInteger index = [namesArray indexOfObject:@"John Smith"];
if (index != NSNotFound) {
    answer = [yesNoArray objectAtIndex:index];
}
return answer;

因为Bavarious问我假设的问题,所以当名字数组按字母顺序排序时,这是一种更好的方法。

int index = [self findName:@"John Smith"];
NSString *answer = nil;
if (index >= 0) {
    answer = [yesNoArray objectAtIndex:index];
}
return answer;

其中函数findName是一个简单的二进制搜索:

-(int)findName:(NSString *)name {
    int min, mid, max;
    NSComparisonResult comparisonResult;
    min = 0;
    max = [namesArray count]-1;
    while (min <= max) {
        mid = min + (max-min)/2;
        comparisonResult = [name compare:[namesArray objectAtIndex:mid]];
        if (comparisonResult == NSOrderedSame) {
            return mid;
        } else if (comparisonResult == NSOrderedDescending) {
            min = mid+1;
        } else {
            max = mid-1;
        }
    }   
    return -1;  
}

答案 1 :(得分:9)

尝试保持两个阵列同步只是在寻找麻烦。当然,它可以完成,但是无论何时修改一个数组,都必须记住对另一个进行相应的更改。通过重新思考存储数据的方式,帮自己一个忙,避免那种错误。

在这种情况下,你有一个{person,boolean}对。一种选择是将每对存储为字典,然后保留这些字典的数组。如果您可以将数据的数量扩展到您拥有的数据之外,这将是一个特别好的计划。另一种选择是使用字典,其中键是人名,值是你的是/否值。这使得您的问题的答案非常简单:

NSString *yesOrNo = [personDictionary objectForKey:personName];

回到原来的问题,你仍然拥有两个数组,最简单的要做的事情就是迭代人数组,直到找到你要找的人,得到该名称的索引,然后在yes / no数组中查找相应的值:

for (person in peopleArray) {
    if ([person isEqualToString:thePersonYoureLookingFor]) {
        yesNoValue = [yesNoArray objectAtIndex:[peopleArray indexOfObject:person];
        break;
    }
}

如果列表中的人数不是太大,那就没问题。如果列表可能很大,那么您需要对person数组进行排序,以便您可以进行二进制搜索。但是,那里的问题是你是/没有数组是分开的,所以在保持yes / no数组正确顺序的同时对personArray进行排序变得复杂。

答案 2 :(得分:2)

您也可以使用下面的代码,可能对您有用,

NSSortDescriptor *_lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@"" ascending:YES];
NSArray *_lastArray = [NSArray arrayWithObject:_lastDescriptor];


firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys]      
sortedArrayUsingDescriptors:_lastArray];
//firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys]                    
sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

for (NSString *eachlastIndex in firstCharacterArray)
{
NSSortDescriptor *lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@""
                                                               ascending:YES];
//selector:@selector(localizedCaseInsensitiveCompare:)] ;
NSArray *descriptorslast = [NSArray arrayWithObject:lastDescriptor];
[[nameIndexesDictionary objectForKey:eachlastIndex]     
sortUsingDescriptors:descriptorslast];
[lastDescriptor release];
}

答案 3 :(得分:0)

您可以使用indexOfObject方法获取元素的索引。

例如

这将为您提供对象的索引

  NSInteger index = [yourArray indexOfObject:objectName];

查看另一个数组中的相应元素

[anotherArray objectAtIndex:index];

这对我有用。希望这会有所帮助。