给定一个字符串,我需要获得出现在该字符串的每个单词的计数。 要做到这一点,我提取的字符串为数组,通过文字和搜索这种方式,但我的感觉是搜索字符串直接是更理想的。 下面是我最初写来解决这个问题的代码。 我为更好的解决方法的建议虽然。
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
- “a2
- “测试” - 2
- “只有1个
这是一个什么NSCountedSet
是。
您需要打散串入字(iOS系统是不够好,给我们一个功能,这样我们就不必担心标点符号),只是他们每个人添加到数集,这使一些轨道次每个对象出现在组:
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])
如果我猜的话,我会说NSRegularExpression
了点。 像这样:
NSUInteger numberOfMatches = [regex numberOfMatchesInString:string
options:0
range:NSMakeRange(0, [string length])];
这片段是取自这里 。
编辑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];
}
}
你应该小心:
- 标点符号。 (近换句话说)
- 大写单词VS小写单词。
我认为这是你想要的长款使用循环中搜索一个词非常糟糕的主意。 您应该使用正则表达式来做到这一点! 我知道这并不容易,在第一时间了解它,但它的真正价值就知道了! 看一看这一情况在使用NSString的正则表达式查找/替换子