2010-12-27 15 views
6

तेजी से गणना करते समय जब मैं सरणी में अंतिम वस्तु तक पहुंच गया हूं तो यह जानने का सबसे अच्छा तरीका क्या है? क्या int को बढ़ाने और फिर सरणी की लंबाई की तुलना करने से बेहतर तरीका है?उद्देश्य सी: फास्ट गणना का उपयोग करते समय अंतिम वस्तु?

उत्तर

15

आप एक सरणी के साथ शुरू कर रहे हैं पिछले तत्व बाहर निकलना (वहाँ ' इसके लिए एक विशिष्ट कॉल है) और इसके खिलाफ गणनाकर्ता में प्राप्त प्रत्येक तत्व की तुलना करें। की तरह कुछ:

id lastEl = [myArray lastObject]; 

for (id anEl in myArray) 
{ 
    if (anEl == lastEl) 
    ..... // do the last thing 
} 

तुलना लागत काउंटर के साथ के रूप में ही है, लेकिन फिर तुम काउंटर या गलतियों कि सदा ही पैदा होती है जब आप काउंटर बढ़ाने के लिए भूल जाते हैं बढ़ाने की लागत नहीं है।

+0

मैं इसके साथ सहमत हूं, लेकिन मेरा मानना ​​है कि यह "lastObject" नहीं है "lastElement"। – slycrel

+0

अब आप और मैं सहमत हूं! कॉल के लिए एसडीके दस्तावेज़ों की जांच न करने के लिए मुझे यही मिलता है। –

+0

महान उत्तर और बस जो मैं खोज रहा था! –

0

मुझे विश्वास नहीं है कि ऐसा करने का कोई भी (सरल) तरीका है - यह तेजी से गणना का उपयोग करने के व्यापार-बंदों में से एक है। इस प्रकार, जब आपको उस आइटम की अनुक्रमणिका के बारे में पता होना चाहिए जिस पर आप अनुमान लगा रहे हैं, तो आपको सुझाव देते हुए एक पूर्णांक बनाना होगा।

कहा कि, आप अब भी इस तथ्य से लाभ होगा कि आप नहीं है जब एक तेज प्रगणक का उपयोग कर, आदि

2

आमतौर पर, तेजी से गणन मतलब है कि आप एक काउंटर उपयोग नहीं कर रहे सीमा से बाहर जा सकते हैं ...

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration.html

अन्य रूप के बिना है एक काउंटर है ...

NSEnumerator *enumerator = [objectSet objectEnumerator]; 
id setObject; 
while ((setObject = [enumerator nextObject]) != nil) 
{ 
    ... 
} 
1

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

तब मैं ब्लॉक गणना का उपयोग करने का सुझाव दूंगा ताकि आपको इंडेक्स और ऑब्जेक्ट मिल सके। समय, और आप तुलना कर सकते हैं।

0

तुम भी ब्लॉक के साथ गणना का उपयोग कर सकते हैं:

[myArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
    BOOL isLastObject = idx == [myArray count]-1; 
    if (isLastObject){ 
     //... 
    } 
}]; 

क्या आप जानते हैं जो एक तरह से अपने सरणी शामिल हैं यह उचित वर्ग के साथ id को बदलने के लिए बेहतर है वस्तुओं है।

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