2012-11-13 11 views
12

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

NSMutableDictionary *sets = [[NSMutableDictionary alloc] init]; 

NSString *paragraph = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"text" ofType:@"txt"] encoding:NSUTF8StringEncoding error:NULL]; 

NSMutableArray *words = [[[paragraph lowercaseString] componentsSeparatedByString:@" "] mutableCopy]; 

while (words.count) { 
    NSMutableIndexSet *indexSet = [[NSMutableIndexSet alloc] init]; 
    NSString *search = [words objectAtIndex:0]; 
    for (unsigned i = 0; i < words.count; i++) { 
     if ([[words objectAtIndex:i] isEqualToString:search]) { 
      [indexSet addIndex:i]; 
     } 
    } 
    [sets setObject:[NSNumber numberWithInt:indexSet.count] forKey:search]; 
    [words removeObjectsAtIndexes:indexSet]; 
} 

NSLog(@"%@", sets); 

उदाहरण:

शुरू स्ट्रिंग:
"।। यह है एक परीक्षण यह केवल एक परीक्षण है"

परिणाम:

  • "यह" - 2
  • "एक" - - 2
  • "परीक्षण" - 2
  • "केवल" 2
  • "है" - 1
+0

क्या आपकी विधि काम करती है? क्या आपको डॉट प्रतीक के साथ समस्या नहीं है? मुझे लगता है कि आपके पास "परीक्षण" होना चाहिए। "परीक्षण" के बजाय। – Ricardo

उत्तर

23

यह बिल्कुल NSCountedSet है।

आपको स्ट्रिंग को शब्दों में अलग करने की आवश्यकता है (जो आईओएस हमें एक समारोह देने के लिए काफी अच्छा है ताकि हमें विराम चिह्न के बारे में चिंता न करें) और बस उनमें से प्रत्येक को गिनती सेट में जोड़ें, जो रखता है सेट में प्रत्येक ऑब्जेक्ट की संख्या कितनी बार दिखाई देती है:

NSString  *string  = @"This is a test. This is only a test."; 
NSCountedSet *countedSet = [NSCountedSet new]; 

[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) 
          options:NSStringEnumerationByWords | NSStringEnumerationLocalized 
         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){ 

          // This block is called once for each word in the string. 
          [countedSet addObject:substring]; 

          // If you want to ignore case, so that "this" and "This" 
          // are counted the same, use this line instead to convert 
          // each word to lowercase first: 
          // [countedSet addObject:[substring lowercaseString]]; 
         }]; 

NSLog(@"%@", countedSet); 

// Results: 2012-11-13 14:01:10.567 Testing App[35767:fb03] 
// <NSCountedSet: 0x885df70> (a [2], only [1], test [2], This [2], is [2]) 
+0

ओएमजी!यह कल्पना करना भी आसान है! धन्यवाद! – RyJ

+0

आपका स्वागत है! – lnafziger

+0

@ इंफजिंजर लेकिन इसमें थोड़ी सी समस्या है, जब मैं एनएसएसटींग में शब्दों की संख्या गिनना चाहता हूं जिसमें कुछ HTML टैग हैं, तो उन्हें छोड़ दें। लेकिन मैं उनको भी गिनना चाहता हूं। इसके लिए कोई विचार। –

2

अगर मुझे लगता है, तो मैं NSRegularExpression कहूंगा। इस तरह:

NSUInteger numberOfMatches = [regex numberOfMatchesInString:string 
                options:0 
                 range:NSMakeRange(0, [string length])]; 

कि झलकी here से लिया गया है।


संपादित 1.0:

क्या सर के आधार पर जब तक कहा:

  • विराम चिह्न संकेत:

    NSString *string = @"This is a test, so it is a test"; 
    
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    NSArray *arrayOfWords = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
    for (NSString *word in arrayOfWords) 
    { 
        if ([dictionary objectForKey:word]) 
        { 
         NSNumber *numberOfOccurences = [dictionary objectForKey:word]; 
         NSNumber *increment = [NSNumber numberWithInt:(1 + [numberOfOccurences intValue])]; 
         [dictionary setValue:increment forKey:word]; 
        } 
        else 
        { 
         [dictionary setValue:[NSNumber numberWithInt:1] forKey:word]; 
        } 
    } 
    

    आप के साथ सावधान रहना चाहिए। (दूसरे शब्दों के नजदीक)

  • अपरकेस शब्द बनाम लोअरकेस शब्द।
+0

मुझे प्रत्येक शब्द की गिनती की आवश्यकता है। तो स्ट्रिंग में, "यह एक परीक्षण है। यह केवल एक परीक्षण है।" "परीक्षण" की गणना 2 होगी, "इस" की गणना 2 होगी, "केवल" की गणना 1, आदि होगी – RyJ

+0

मेरे संपादन की जांच करें .. – Peres

1

मुझे लगता है कि यह वास्तव में बुरा विचार है कि आप एक लूप के साथ लंबे पैराग्राफ के बीच शब्दों को खोजने की कोशिश कर रहे हैं। ऐसा करने के लिए आपको नियमित अभिव्यक्ति का उपयोग करना चाहिए! मुझे पता है कि इसे सीखने के लिए पहली बार आसान नहीं है लेकिन यह जानना वाकई लायक है! इस मामले को देखें Use regular expression to find/replace substring in NSString

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