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

Iphone 获取数组中对象的索引以查找其他数组中相应的对象,iphone,objective-c,ios,arrays,cocoa-touch,Iphone,Objective C,Ios,Arrays,Cocoa Touch,我有两个数组。一个是名称数组,另一个是由标题为“是”或“否”的字符串组成的数组。“name”数组中每个名称的索引路径与“Yes/No”数组中的相同索引路径相对应。例如: Names数组|是/否数组 第1人|是 第2人|否 第三人|是 查找人名(可能获取其索引路径)并在“是/否”数组中检查其是否为“是”或“否”的最简单方法是什么 此外,我不确定“索引路径”是否是正确的术语。如果不是,我指的是数组中的对象数。NSArray有一个名为indexOfObject的方法,该方法将返回对应数组值等于某个对

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

Names数组|是/否数组
第1人|是
第2人|否
第三人|是
查找人名(可能获取其索引路径)并在“是/否”数组中检查其是否为“是”或“否”的最简单方法是什么


此外,我不确定“索引路径”是否是正确的术语。如果不是,我指的是数组中的对象数。

NSArray
有一个名为
indexOfObject
的方法,该方法将返回对应数组值等于某个对象的最低索引,如果找不到这样的对象,则返回NSNotFound。如果名称数组未排序,则使用此方法获取索引,然后将其插入Yes/No数组。也就是说,大致如下:

NSString *answer = nil;
NSUInteger index = [namesArray indexOfObject:@"John Smith"];
if (index != NSNotFound) {
    answer = [yesNoArray objectAtIndex:index];
}
return answer;
因为我在假设的地方问了很多问题,所以当名称数组按字母顺序排序时,这里有一个更好的方法

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;  
}
-(int)findName:(NSString*)名称{
最小整数、中间整数、最大整数;
N比较结果比较结果;
最小值=0;
max=[namesArray count]-1;

虽然(min试图保持两个数组同步只是自找麻烦。当然,这是可以做到的,但无论何时修改一个数组,都必须记住对另一个数组进行相应的更改。帮你自己一个忙,通过重新考虑存储数据的方式来避免整个类别的错误

在本例中,您得到了一个{person,boolean}配对。一种方法是将每对数据存储为一个字典,然后保留这些字典的数组。如果您可以将数据的数量扩展到现有的两个以上,这将是一个特别好的计划。另一种方法是只使用一个字典,其中键是人名,值是您的是/否值。这使得他对你的问题的回答很简单:

NSString *yesOrNo = [personDictionary objectForKey:personName];
回到您原来的问题,您仍然有两个数组,最简单的方法是迭代person数组,直到找到要查找的人,获取该名称的索引,然后在yes/no数组中查找相应的值:

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

如果列表中的人数不是太多,那也没关系。如果列表可能很大,那么您需要对person数组进行排序,以便进行二进制搜索。但问题是,您的yes/no数组是分开的,因此在对Personary进行排序的同时,将yes/no数组保持在正确的顺序会变得很复杂。

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

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];
}

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

比如说

这将为您提供对象的索引

  NSInteger index = [yourArray indexOfObject:objectName];
查看另一个数组中的对应元素

[anotherArray objectAtIndex:index];

这对我很有用。希望这对我有帮助。

你是保持名称数组的排序还是不排序?@bavaried unsorted,但它是由服务器生成的,因此没有重复项。PengOne回答了我的问题。我正在寻找indexOfObject方法。你可以使用
NSArray
的二进制搜索方法。;-)@Bavariable:它有一个!我觉得错过了这一点很傻。+1:根据需要,字典/自定义类和排序数组+二进制搜索也是一个很好的解决方案。这是我最初想要做的,但我不知道如何从我的服务器获取所有信息。我现在正在做的是请求名称s列表,让服务器内爆名称,然后在我的应用程序中将它们分解为一个数组。然后对yes/no数组执行相同的操作。这样做的更好方法是什么?@Preston,即使您从两个数组开始,也很容易从两个数组创建字典:
peopleDictionary=[NSDictionary Dictionary WithObjects:yesNoArray和Keys:peopleArray];
。如果您想要一个字典数组,这并不难——只要创建一个循环,从每个数组的相应元素构造一个字典,然后将该字典添加到最终数组中即可。Bavary提到的自定义类也是一个不错的选择,特别是如果有任何与人相关的逻辑。