2011-06-18 43 views
19

我有兩個數組。一個是一個名稱數組,另一個是由標題爲「是」或「否」的字符串組成的數組。 「name」數組中每個名稱的索引路徑與「Yes/No」數組中的相同索引路徑相對應。例如:獲取數組中對象的索引以查找其他數組中的對應對象

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

什麼是查找一個人的名字(可能得到它的索引路徑)和最簡單的檢查方法是否在「是是「是」或「否」 /沒有「陣列?

此外,我不確定是否「索引路徑」是正確的使用條款。如果不是,我的意思是一個對象在數組中的數字。

+0

您是否將名稱數組排序或未排序? – 2011-06-18 03:18:35

+1

@Bavarious未分類,但它是由服務器生成的,所以沒有重複。但彭一回答了我的問題。我正在尋找indexOfObject方法。 – Preston

回答

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

你可以使用'NSArray'的二進制搜索方法。 ;-) – 2011-06-18 03:31:34

+0

@Bavarious:它有一個!我感到很愚蠢,因爲錯過了這一點。 – PengOne

9

試圖保持同步的兩個陣列是自找麻煩。當然可以這樣做,但是每當你修改一個數組時,你必須記得對另一個進行相應的修改。通過重新思考存儲數據的方式,幫助自己,並避免整個類別的錯誤。

在這種情況下,你有一個{person,boolean}對。一種選擇是將每一對存儲爲字典,然後保存這些字典的數組。如果您可以將數據數量擴展到超出兩個數據的數量,這將是一個特別好的計劃。另一種選擇是使用字典,其中鍵是人名,值是你的是/否值。這使得回答你的問題很簡單:

NSString *yesOrNo = [personDictionary objectForKey:personName]; 

再回到你原來的問題,你仍然有兩個數組,該最容易要做的是遍歷人陣,直到找到你要找的人,得到這個名字的索引,然後查找相應的值是/否陣列:

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

那很好,如果人在列表中的號碼不會太大。如果列表可能很大,那麼您將需要保留人員數組排序,以便您可以執行二進制搜索。然而,那裏的麻煩是,你是/沒有數組是分開的,因此按照正確的順序排列personArray,同時保持yes/no數組變得複雜。

+0

+1:根據需要,字典/自定義類和排序數組+二進制搜索也是一個很好的解決方案。 – 2011-06-18 03:34:03

+0

這就是我最初想要做的,但我無法弄清楚如何從我的服務器獲取所有信息。我現在正在做的是請求名稱列表並讓服務器內化名稱,然後將它們在我的應用程序中爆炸成一個數組。然後爲yes/no數組做同樣的事情。什麼會是更好的方式呢? – Preston

+2

@Preston,即使你從兩個數組開始,很容易從兩個數組創建一個字典:'peopleDictionary = [NSDictionary dictionaryWithObjects:yesNoArray andKeys:peopleArray];'。如果你想要一個字典數組,這並不困難 - 只需創建一個循環,從每個數組的相應元素構造一個字典,然後將該字典添加到最終數組中。 Bavarious提到的習慣班也是一個不錯的選擇,特別是如果有任何與人有關的邏輯。 – Caleb

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

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

例如

這會給你指數的對象

NSInteger index = [yourArray indexOfObject:objectName]; 

的從另一個陣列

[anotherArray objectAtIndex:index]; 

這個工作對我看到相應的元素。希望這可以幫助。