2011-06-18 54 views
19

Tôi có hai mảng. Một là một mảng các tên và một là một mảng tạo thành các chuỗi có tiêu đề "Có" hoặc "Không". Đường dẫn chỉ mục của mỗi tên trong mảng "name" tương ứng với cùng một đường dẫn chỉ mục trong mảng "Có/Không". Ví dụ:Nhận chỉ mục của đối tượng trong mảng để tìm kiếm đối tượng tương ứng trong mảng khác

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

Điều gì sẽ là cách dễ nhất để tìm kiếm tên của một người (có thể nhận được các đường chỉ số của nó) và kiểm tra xem họ là "Có" hoặc "Không" trong "Có/Không có "mảng?

Ngoài ra, tôi không chắc liệu "đường dẫn chỉ mục" có phải là thuật ngữ phù hợp để sử dụng hay không. Nếu nó không phải là, tôi có nghĩa là số lượng một đối tượng trong một mảng.

+0

Bạn có sắp xếp hoặc sắp xếp các mảng tên không? –

+1

@Bavarious Unsorted, nhưng nó được tạo ra bởi một máy chủ do đó không có bản sao. Tuy nhiên, PengOne đã trả lời câu hỏi của tôi. Tôi đang tìm phương thức indexOfObject. – Preston

Trả lời

31

NSArray có phương thức được gọi là indexOfObject sẽ trả về chỉ mục thấp nhất có giá trị mảng tương ứng bằng anObject hoặc NSNotFound nếu không tìm thấy đối tượng đó. Nếu mảng tên của bạn chưa được phân loại, hãy sử dụng nó để lấy chỉ mục mà bạn có thể cắm vào mảng Có/Không. Tức là, một cái gì đó dọc theo các dòng này:

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

Vì Bavarious đặt câu hỏi ở đâu, đây là cách tốt hơn khi mảng tên được sắp xếp theo thứ tự bảng chữ cái.

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

nơi hàm findName là một tìm kiếm nhị phân đơn giản:

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

Bạn có thể đã sử dụng phương pháp tìm kiếm nhị phân của 'NSArray'. ;-) –

+0

@Bavarious: Nó có một! Tôi cảm thấy ngớ ngẩn vì đã bỏ lỡ điều đó. – PengOne

9

Đang cố gắng để giữ cho hai mảng đồng bộ chỉ là chuốc lấy phiền. Nó có thể được thực hiện, tất nhiên, nhưng bất cứ khi nào bạn sửa đổi một mảng, bạn phải nhớ để thực hiện một thay đổi tương ứng với khác. Làm cho bạn một ưu và tránh rằng toàn bộ lớp lỗi bằng cách suy nghĩ lại cách bạn đang lưu trữ dữ liệu.

Trong trường hợp này, bạn có cặp {person, boolean}. Một tùy chọn là lưu trữ từng cặp như một từ điển, và sau đó giữ một mảng các từ điển đó. Đây sẽ là một kế hoạch đặc biệt tốt nếu bạn có thể mở rộng số lượng dữ liệu vượt quá hai phần dữ liệu mà bạn có. Một tùy chọn khác là chỉ sử dụng từ điển trong đó các khóa là tên người và các giá trị là giá trị có/không của bạn. Điều này làm cho câu trả lời cho câu hỏi của bạn rất đơn giản:

NSString *yesOrNo = [personDictionary objectForKey:personName]; 

Bắt trở lại câu hỏi ban đầu của bạn, mà bạn vẫn có hai mảng, các dễ nhất điều cần làm là để lặp qua mảng người cho đến khi bạn tìm ra người mà bạn đang tìm kiếm, lấy chỉ mục của tên đó, và sau đó tra cứu giá trị tương ứng trong mảng có/không:

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

Sẽ ổn nếu số lượng người trong danh sách không quá lớn . Nếu danh sách có thể lớn, thì bạn sẽ muốn giữ cho mảng được sắp xếp để bạn có thể thực hiện tìm kiếm nhị phân. Mặc dù vậy, vấn đề ở đây là bạn có/không có mảng riêng biệt, do đó, sắp xếp personArray trong khi vẫn giữ mảng có/không theo đúng thứ tự trở nên phức tạp.

+0

+1: Tùy thuộc vào yêu cầu, từ điển/lớp tùy chỉnh và mảng được sắp xếp + tìm kiếm nhị phân cũng là một giải pháp tốt. –

+0

Đó là những gì tôi ban đầu muốn làm, nhưng tôi không thể tìm ra cách để có được tất cả các thông tin đó từ máy chủ của tôi. Những gì tôi đang làm ngay bây giờ là yêu cầu danh sách tên và có máy chủ imploding các tên, sau đó phát nổ chúng thành một mảng trong ứng dụng của tôi. Sau đó làm điều tương tự cho mảng có/không. Điều gì sẽ là một cách tốt hơn để làm điều đó? – Preston

+2

@Preston, ngay cả khi bạn bắt đầu với hai mảng, thật dễ dàng để tạo một từ điển từ hai mảng: 'peopleDictionary = [Từ điển NSDictionaryWithObjects: yesNoArray andKeys: peopleArray];'. Nó không khó hơn nhiều nếu bạn muốn một mảng từ điển - chỉ cần tạo một vòng lặp để xây dựng một từ điển từ các phần tử tương ứng của mỗi mảng và sau đó thêm từ điển đó vào mảng cuối cùng. Lớp tùy chỉnh mà Bavarious ám chỉ cũng là một lựa chọn tốt, đặc biệt nếu có bất kỳ logic nào liên quan đến một người. – Caleb

2

Bạn cũng có thể sử dụng dưới đây của mã này, May hữu ích của nó đối với bạn,

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

Bạn có thể sử dụng phương pháp indexOfObject để có được những chỉ số của phần tử.

ví dụ

này sẽ cung cấp cho bạn chỉ số của đối tượng của bạn

NSInteger index = [yourArray indexOfObject:objectName]; 

Để xem các yếu tố tương ứng từ một mảng

[anotherArray objectAtIndex:index]; 

này đã làm việc cho tôi. Hi vọng điêu nay co ich.

Các vấn đề liên quan