2011-05-30 8 views
5

निम्नलिखित NSString श्रेणी विधि का एक सरल कार्यान्वयन क्या है जो self में शब्दों की संख्या देता है, जहां शब्दों को लगातार रिक्त स्थान या न्यूलाइन वर्णों से अलग किया जाता है? इसके अलावा, स्ट्रिंग 140 वर्णों से कम होगी, इसलिए इस मामले में, मैं कुछ प्रदर्शन के बलिदान पर सादगी & पठनीयता को पसंद करता हूं।उद्देश्य-सी: - [एनएसएसटींग शब्दकाउंट]

@interface NSString (Additions) 
- (NSUInteger)wordCount; 
@end 

मैं निम्नलिखित समाधान पाया:

लेकिन, वहाँ एक आसान तरीका नहीं है?

+1

"निम्नलिखित NSString श्रेणी का एक सरल कार्यान्वयन ...", और यह सीधे यहाँ भावी पीढ़ी के लिए तैनात है - फिर भी, अपने मूल प्रश्न के जवाब देने के लिए मैं नहीं देखता कि यहां रैखिक खोज से बेहतर कैसे करना संभव है। ScanUpToCharactersFromSet के कार्यान्वयन के आधार पर, यह ज्यादातर मामलों में ओ (एन) से बेहतर किराया दे सकता है। – tjarratt

+0

@tjarratt: मुझे लगता है कि ओपी "सबसे सरल" विधि चाहता है, जरूरी नहीं कि सबसे तेज़। –

+0

एक स्ट्रिंग गणना में NSStringEnumerationByWords का उपयोग करके शब्द और गिनती के बारे में कैसे? –

उत्तर

1

ऐसा लगता है कि मेरे प्रश्न में मैंने जो दूसरा लिंक दिया है, वह अभी भी सबसे तेज नहीं बल्कि हिंडसाइट में, अपेक्षाकृत सरल implementation of -[NSString wordCount] है।

+0

इस क्रियान्वयन के साथ किसी शब्द की परिभाषा अनुकूलन योग्य नहीं है। –

15

क्यों न केवल निम्नलिखित कार्य करें?

- (NSUInteger)wordCount { 
    NSCharacterSet *separators = [NSCharacterSet whitespaceAndNewlineCharacterSet]; 
    NSArray *words = [self componentsSeparatedByCharactersInSet:separators]; 

    NSIndexSet *separatorIndexes = [words indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { 
     return [obj isEqualToString:@""]; 
    }]; 

    return [words count] - [separatorIndexes count]; 
} 
+0

धन्यवाद! यह बिल्कुल सही और सरल लगता है। मुझे आश्चर्य है कि यह कुशल है या नहीं। मेरे मामले में काफी अच्छा है, हालांकि मैं एक आईओएस ऐप बना रहा हूं, न कि एक ऑपरेटिंग सिस्टम। :) मुझें यह पसंद है! – ma11hew28

+0

हम्म .. मुझे नहीं लगता कि यह बिल्कुल सही है। एक्सकोड दस्तावेज के मुताबिक: "विभाजक पात्रों की निकट घटनाएं परिणाम में खाली तार उत्पन्न करती हैं। इसी तरह, यदि स्ट्रिंग विभाजक वर्णों के साथ शुरू होती है या समाप्त होती है, तो क्रमशः पहला या अंतिम सबस्ट्रिंग खाली होता है।" मैं खाली तारों को शब्दों के रूप में गिनना नहीं चाहता हूं। उदाहरण के लिए, विधि को '@ "हैलो" के लिए 1 वापस करना चाहिए, न कि 3. – ma11hew28

+0

अच्छा!यह काम करता हैं! मैंने नेट पर पाया गया एक और समाधान की शुद्धता की भी पुष्टि की, और यह आपके कार्यान्वयन के रूप में लगभग दोगुनी तेज़ लगता है और अभी भी काफी सरल है। इसलिए, [मैंने इसे एक उत्तर के रूप में पोस्ट किया] [http://stackoverflow.com/questions/6171422/objective-c-nsstring-wordcount/6171849#6171849)। – ma11hew28

3
- (NSUInteger) wordCount 
{ 
    NSArray *words = [self componentsSeparatedByString:@" "]; 
    return [words count]; 
} 
+1

यदि आपके पास रिक्त स्थान या न्यूलाइन के रन हैं तो यह अधिक मायने रखता है। – Obliquely

+0

एकाधिक रिक्त स्थान या एकाधिक न्यूलाइन के लिए गलत गणना '@" \ n \ n \ n "'। कृपया ऊपर सही समाधान देखें: http://stackoverflow.com/a/6171439/1033581 –

8

सरल कार्यान्वयन की एक संख्या हैं, लेकिन वे सभी समझौते होते हैं।

- (NSUInteger)wordCount { 
    return [[NSSpellChecker sharedSpellChecker] countWordsInString:self language:nil]; 
} 

यह रूप में स्कैनर बस [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] count] का उपयोग कर भी तुच्छ के रूप में सही रूप में शब्दों की गिनती करने के लिए: उदाहरण के लिए, कोको (लेकिन कोको टच) शब्द की गिनती में पकाया है। लेकिन मुझे लगता है कि उस विधि का प्रदर्शन लंबे तारों के लिए बहुत कम हो जाता है।

तो यह उन ट्रेडऑफों पर निर्भर करता है जिन्हें आप बनाना चाहते हैं। मैंने पाया है कि पूर्ण तेज़ी से सीधे ICU पर जाना है। यदि आप सबसे सरल चाहते हैं, मौजूदा कोड का उपयोग करना शायद किसी भी कोड को लिखने से सरल है।

8

मुझे विश्वास है कि आपने 'सरलतम' की पहचान की है।

@implementation NSString (GSBString) 

- (NSUInteger)wordCount 
{ 
    __block int words = 0; 
    [self enumerateSubstringsInRange:NSMakeRange(0,self.length) 
          options:NSStringEnumerationByWords 
          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {words++;}]; 
    return words; 
} 

@end 
+0

इस क्रियान्वयन के साथ किसी शब्द की परिभाषा अनुकूलन योग्य नहीं है। –

+0

@ Cœur लेकिन रिक्त स्थान के बिना भाषाएं हैं। –

0

स्विफ्ट 3::

let words: [Any] = (string.components(separatedBy: " ")) 
let count = words.count