2011-06-18 21 views
19

में संबंधित ऑब्जेक्ट को देखने के लिए सरणी में ऑब्जेक्ट की अनुक्रमणिका प्राप्त करें मेरे पास दो सरणी हैं। एक नामों की एक सरणी है और दूसरा "हां" या "नहीं" नामक तारों से बना एक सरणी है। "नाम" सरणी में प्रत्येक नाम का इंडेक्स पथ "हां/नहीं" सरणी में एक ही अनुक्रमणिका पथ से मेल खाता है। उदाहरण के लिए:अन्य सरणी

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

कि क्या वे "हाँ में" हाँ "या" नहीं "हैं सबसे आसान तरीका है किसी व्यक्ति का नाम ऊपर देखो (संभवतः यह सूचकांक पथ हो रही) और जांच करने के लिए किया जाएगा क्या/नहीं "सरणी?

इसके अलावा, मुझे यकीन नहीं है कि "इंडेक्स पथ" का उपयोग करने का सही शब्द है या नहीं। यदि यह नहीं है, तो मेरा मतलब है कि कोई ऑब्जेक्ट एक सरणी में है।

+0

क्या आप नाम सरणी को क्रमबद्ध या छोड़े गए हैं? –

+1

@ बेवारियस अनसोर्टेड, लेकिन यह सर्वर द्वारा उत्पन्न होता है इसलिए कोई डुप्लीकेट नहीं होता है। पेंगने ने हालांकि मेरे प्रश्न का उत्तर दिया। मैं indexOfObject विधि की तलाश में था। – Preston

उत्तर

31

NSArray एक विधि indexOfObject कहा जाता है कि या तो सबसे कम सूचकांक जिसका इसी सरणी मान anObject या NSNotFound के बराबर है, तो ऐसी कोई वस्तु पाया जाता है वापस आ जाएगी है। यदि आपके नामों की सरणी निरस्त नहीं है, तो उस इंडेक्स को प्राप्त करने के लिए इसका उपयोग करें जिसे आप हां/नहीं सरणी में प्लग कर सकते हैं।

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' की बाइनरी खोज विधि का उपयोग कर सकते थे। ;-) –

+0

@ बेवारियस: इसमें एक है! मैं इसे याद करने के लिए मूर्खतापूर्ण महसूस करता हूं। – PengOne

9

दो सरणियों सिंक्रनाइज़ रखने के लिए कोशिश कर रहा बस मुसीबत के लिए पूछ रहा है। यह निश्चित रूप से किया जा सकता है, लेकिन जब भी आप एक सरणी को संशोधित करते हैं, तो आपको दूसरे में एक समान परिवर्तन करना याद रखना होगा। अपने आप को एक पक्ष बनाओ और डेटा संग्रहित करने के तरीके पर पुनर्विचार करके उस बग की पूरी कक्षा से बचें।

इस मामले में, आपके पास एक {व्यक्ति, बूलियन} जोड़ी है। एक विकल्प प्रत्येक जोड़ी को एक शब्दकोश के रूप में स्टोर करना है, और फिर उन शब्दकोशों की एक सरणी रखना है। यदि आप दोनों के पास डेटा के टुकड़ों की संख्या का विस्तार कर सकते हैं तो यह एक विशेष रूप से अच्छी योजना होगी। एक अन्य विकल्प केवल एक शब्दकोश का उपयोग करना होगा जहां कुंजी व्यक्ति के नाम हों और मान आपके हां/नहीं मान हैं। यह आपके सवाल का जवाब बहुत सरल बनाता है:

NSString *yesOrNo = [personDictionary objectForKey:personName]; 

वापस अपने मूल प्रश्न, आप अभी भी दो सरणियों है जहां के लिए हो रही है, सबसे आसान करने के लिए बात व्यक्ति सरणी पर पुनरावृति जब तक आप को मिल रहा है जिस व्यक्ति को खोज रहे हैं, वह नाम के सूचकांक मिलता है, और फिर हाँ में संबंधित मान को देखने/कोई सरणी:

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

यह ठीक है कि अगर सूची में लोगों की संख्या बहुत बड़ी नहीं है । यदि सूची बड़ी हो सकती है, तो आप व्यक्ति सरणी को सॉर्ट करना चाहेंगे ताकि आप बाइनरी खोज कर सकें। हालांकि, समस्या यह है कि आप हां/नहीं सरणी अलग हैं, इसलिए व्यक्ति को सॉर्ट करना सही क्रम में हाँ/नहीं सरणी रखने के दौरान जटिल हो जाता है।

+0

+1: आवश्यकताओं के आधार पर, एक शब्दकोश/कस्टम वर्ग और एक क्रमबद्ध सरणी + बाइनरी खोज भी एक अच्छा समाधान है। –

+0

यही वह मूल रूप से करना चाहता था, लेकिन मैं यह नहीं समझ पाया कि मेरे सर्वर से उस सारी जानकारी को कैसे प्राप्त किया जाए। मैं अभी क्या कर रहा हूं नाम सूची का अनुरोध कर रहा हूं और सर्वर को नामों को आरोहित कर रहा है, फिर उन्हें अपने आवेदन में एक सरणी में विस्फोट कर रहा है। फिर हां/नहीं सरणी के लिए एक ही काम कर रहे हैं। ऐसा करने का एक बेहतर तरीका क्या होगा? – Preston

+2

@ प्रेस्टन, भले ही आप दो एरे के साथ शुरू करते हैं, फिर भी दो एरे से एक शब्दकोश बनाना आसान है: 'peopleDictionary = [NSDictionary dictionaryWithObjects: yesNoArray औरKeys: peopleArray]; '। यदि आप शब्दकोशों की एक सरणी चाहते हैं तो यह अधिक कठिन नहीं है - बस एक लूप बनाएं जो प्रत्येक सरणी के संबंधित तत्वों से एक शब्दकोश बनाता है और फिर उस सरणी को अंतिम सरणी में जोड़ता है। बर्बरस के लिए बताई गई कस्टम क्लास भी एक अच्छा विकल्प है, खासकर यदि किसी व्यक्ति से संबंधित कोई तर्क है। – 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]; 

यह मेरे लिए काम किया से इसी तत्व को देखने के लिए दे देंगे। उम्मीद है की यह मदद करेगा।

संबंधित मुद्दे