Получить индекс объекта в массиве для поиска соответствующего объекта в другом массиве - PullRequest
19 голосов
/ 18 июня 2011

У меня есть два массива. Один - это массив имен, а другой - массив, состоящий из строк с названиями «Да» или «Нет». Путь индекса каждого имени в массиве «имя» соответствует тому же пути индекса в массиве «Да / Нет». Например:

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

Какой самый простой способ найти имя человека (возможно, получить его индексный путь) и проверить, являются ли они "Да" или "Нет" в массиве "Да / Нет"?

Кроме того, я не уверен, является ли термин «путь индекса» правильным термином. Если это не так, я имею в виду номер объекта в массиве.

Ответы [ 4 ]

31 голосов
/ 18 июня 2011

NSArray имеет метод с именем indexOfObject, который будет возвращать либо самый низкий индекс, соответствующее значение массива которого равно anObject, либо NSNotFound, если такой объект не найден.Если ваш массив имен не отсортирован, используйте его, чтобы получить индекс, который вы можете подключить к массиву Да / Нет.То есть что-то вроде этого:

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;  
}
9 голосов
/ 18 июня 2011

Попытка синхронизировать два массива просто напрашивается на неприятности.Конечно, это можно сделать, но всякий раз, когда вы изменяете один массив, вы должны помнить, что нужно внести соответствующие изменения в другой.Сделайте себе одолжение и избегайте всего этого класса ошибок, переосмыслив способ хранения данных.

В этом случае у вас есть пара {person, boolean}.Один из вариантов - сохранить каждую пару в качестве словаря, а затем сохранить массив этих словарей.Это был бы особенно хороший план, если бы вы могли расширить количество фрагментов данных за пределы двух имеющихся у вас.Другой вариант - просто использовать словарь, в котором ключи - это имена людей, а значения - ваши значения yes / no.Это делает ответ на ваш вопрос очень простым:

NSString *yesOrNo = [personDictionary objectForKey:personName];

Возвращаясь к исходному вопросу, где у вас все еще есть два массива, самый простой , что нужно сделать, это перебратьмассив person, пока вы не найдете нужного человека, получите индекс этого имени, а затем найдите соответствующее значение в массиве yes / no:

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

Это нормально, если количество людейв списке не слишком большой.Если список может быть большим, тогда вы захотите сохранить отсортированный массив, чтобы вы могли выполнять бинарный поиск.Но проблема в том, что массив yes / no является отдельным, поэтому сортировка personArray с сохранением массива yes / no в правильном порядке становится сложной.

2 голосов
/ 06 декабря 2012

Вы также можете использовать приведенный ниже код, может он пригодится вам,

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];
}
0 голосов
/ 11 июня 2015

Вы можете использовать метод indexOfObject для получения индекса элемента.

например

Это даст вам индекс вашего объекта

  NSInteger index = [yourArray indexOfObject:objectName];

Чтобы увидетьсоответствующий элемент из другого массива

[anotherArray objectAtIndex:index];

Это сработало для меня.Надеюсь, это поможет.

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