2011-06-18 5 views
19

2つの配列があります。 1つは名前の配列で、もう1つは「はい」または「いいえ」というタイトルの文字列で構成された配列です。 "name"配列内の各名前のインデックスパスは、 "Yes/No"配列内の同じインデックスパスに対応しています。たとえば、次のように配列内のオブジェクトのインデックスを取得して、他の配列内の対応するオブジェクトを検索します。

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

何が(おそらくそれのインデックスパスを取得)人の名前を検索する最も簡単な方法であることと、彼らは「はいに「はい」か「いいえ」であるかどうかをチェックします/いいえ "配列?

また、「インデックスパス」が正しい用語であるかどうかはわかりません。そうでない場合、オブジェクトが配列内にある数を意味します。

+0

名前の配列をソート済みまたはソート済みのままにしますか? –

+1

@Bavarious Unsortedですが、サーバーによって生成されるため、重複はありません。 PengOneは私の質問に答えました。私はindexOfObjectメソッドを探していました。 – Preston

答えて

31

NSArrayにはindexOfObjectというメソッドがあり、対応する配列値がオブジェクトに等しい最下位インデックスまたはそのようなオブジェクトが見つからない場合はNSNotFoundを返します。名前の配列がソートされていない場合は、これを使用して、Yes/No配列にプラグインできるインデックスを取得します。つまり、これらの線に沿って何かである:Bavarious私は仮定の質問を尋ねるので

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

、ここに名前の配列をアルファベット順にソートされ、より良い方法です。ただトラブルを求めている同期二つの配列を維持しようとし

-(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

'NSArray'のバイナリ検索メソッドを使用できました。 ;-) –

+0

@Bavarious:これは1つです!私はそれを見逃して、むしろ愚かな気がする。 – PengOne

9

:機能findNameは、単純な二分探索である

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

。これはもちろん可能ですが、あるアレイを変更するたびに、他のアレイに対応する変更を行うことを忘れないでください。自分の好きなことをして、データの格納方法を再考することで、バグ全体を回避してください。

この場合、{person、boolean}のペアがあります。 1つの選択肢は、各ペアを辞書として保存し、それらの辞書の配列を保持することです。あなたが持っている2つのデータの数を超えてデータの数を増やすことができれば、これは特に良い計画です。もう一つの選択肢は、キーが人名で、その値があなたのyes/no値である辞書を使うことです。これは、あなたの質問への答えは非常に簡単になります:

NSString *yesOrNo = [personDictionary objectForKey:personName]; 

は、バックあなたはまだ二つの配列を持っているあなたの元の質問に取得あなたが見つけるまで、実行する最も簡単事は人の配列を反復することですあなたが探している人、その名のインデックスを取得した後、はいに対応する値を検索/いいえ配列:

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

リスト中の人の数があまりにも大きくない場合には罰金です。リストが大きい場合は、バイナリ検索ができるように人物配列をソートしたままにしておきたいでしょう。そこでの問題は、あなたがはい/いいえ配列が分かれていることです。そうすれば、正しい順序でyes/no配列を保持しながらpersonArrayをソートするのは複雑になります。

+0

+1:要件に応じて、辞書/カスタムクラスとソート配列+バイナリ検索が良い解決策です。 –

+0

これは当初のやりたいことでしたが、私のサーバーからその情報をすべて取得する方法を理解できませんでした。私が今やっているのは、名前リストを要求し、サーバーに名前を畳み込ませてから、それらをアプリケーションの配列に展開することです。次に、yes/no配列に対して同じことを行います。それを行うためのより良い方法は何でしょうか? – Preston

+2

@Prestonでは、2つの配列から始めても、 'peopleDictionary = [NSDictionary dictionaryWithObjects:yesNoArray andKeys:peopleArray];'という2つの配列から辞書を作成するのは簡単です。辞書の配列が必要な場合はそれほど難しくありません。各配列の対応する要素から辞書を構築し、その辞書を最終​​配列に追加するループを作成するだけです。 Bavariousが指摘したカスタムクラスは、特に人に関連するロジックがある場合には、良い選択肢です。 – Caleb

2

また、あなたは要素のインデックスを取得するためにindexOfObjectメソッドを使用することができ、あなたにその有益な可能性があり、コードの下に

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

を使用することができます。例

ため

は、これはあなたにこれが私のために働いた別の配列

[anotherArray objectAtIndex:index]; 

から対応する要素を表示するには、あなたのオブジェクトのインデックス

NSInteger index = [yourArray indexOfObject:objectName]; 

を与えるだろう。お役に立てれば。

関連する問題