我需要滚动几千个单词来对它们进行分类......以确定哪些单词具有相同的模式。 (这部分有效) 例如,一个四字母的单词,在第二个和第二个单词中有两个m。第四位表示模式(“-m-m”)。一旦我完成了所有的单词,我就会知道对于任何给定的模式有多少单词。我现在正在滚动,但我遇到的问题是“记住”我在任何给定模式中有多少单词。
我正在考虑使用NSMutableDictionary,并且键是模式('-m-m-'),对象表示该模式的计数。这意味着每次遇到模式时,我都会在字典中查找该模式,获取密钥,增加密钥,然后将其放回字典中。
我需要帮助执行此任务的决策和语法。
谢谢
答案 0 :(得分:3)
你的问题的答案是你(给定)问题的这一部分“我会知道任何给定模式有多少单词。”我会使用一个字典数组。您使用字典存储键值对:已知模式和计数。并且您使用该数组来存储这些KVP记录。因此,下次检测到模式时,搜索该记录的数组(字典),如果找到,则递增计数。如果没有,请创建新记录并将计数设置为1.
添加了示例代码:
#define kPattern @"Pattern"
#define kPatternCount @"PatternCount"
-(NSMutableDictionary *)createANewDictionaryRecord:(NSString *) newPattern
{
int count = 1;
NSMutableDictionary *myDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:
newPattern, kPattern,
[NSString stringWithFormat:@"%i",count], kPatternCount,
nil];
return myDictionary;
}
-(void)addANewPatternToArray:(NSMutableDictionary *)newDictionary
{
// NSMutableArray *myArrayOfDictionary = [[NSMutableArray alloc]init]; // you need to define it somewhere else and use property etc.
[self.myArrayOfDictionary addObject:newDictionary]; //or [self.myArrayOfDictionary addObject:newDictionary]; if you follow the recommendation above.
}
-(BOOL)existingPatternLookup:(NSString *)pattern
{
for (NSMutableDictionary *obj in self.myArrayOfDictionary)
{
if ([[obj objectForKey:kPattern] isEqual:pattern])
{
int count = [[obj objectForKey:kPatternCount] intValue] + 1;
[obj setValue:[NSString stringWithFormat:@"%i",count] forKey:kPatternCount];
return YES;
}
}
[self.myArrayOfDictionary addObject:[self createANewDictionaryRecord:pattern]];
return NO;
}
-(void)testData
{
NSMutableDictionary *newDict = [self createANewDictionaryRecord:@"mmm"];
[self addANewPatternToArray:newDict];
}
-(void) printArray
{
for (NSMutableDictionary * obj in self.myArrayOfDictionary)
{
NSLog(@"mydictionary: %@", obj);
}
}
- (IBAction)buttonPressed:(id)sender
{
if ([self existingPatternLookup:@"abc"])
{
[self printArray];
} else
{
[self printArray];
}
}
答案 1 :(得分:0)
不是一个客观的C专家但是之前在java中解决这个问题,我会说一个字典(我在java中使用地图时)是最好的方法。检查密钥(模式)是否已经存在,如果这样增加,则count将新的一个放入字典中。
编辑
如果你不想获得一个模式的计数,但实际上告诉哪些单词属于该模式,我会使用字符串字典到可变数组。在数组中存储单词,数组的键是模式(作为字符串),类似于上面的代码,但不是只是递增计数,而是必须将新单词添加到数组中。
答案 2 :(得分:0)
NSDictionary和NSMutableDictionary的唯一区别是可以添加对象。我认为你的实施很好,但英语是一门复杂的语言。使用正则表达式解析字符串比为其设置密钥更有效。
答案 3 :(得分:0)
为什么不使用NSCountedSet
代替:
..在iOS 2.0及更高版本中可用?
插入NSCountedSet对象的每个不同对象都有一个与之关联的计数器。 NSCountedSetkeeps跟踪对象插入的次数[...]因此,即使对象已多次添加到集合中,NSSet对象中也只有一个对象实例。由超类NSSet定义的count方法具有特殊意义;它返回不同对象的数量,而不是对象在集合中表示的总次数。
然后使用:
- (NSUInteger)countForObject:(id)anObject
答案 4 :(得分:-1)
使用NSMutableArrays的字典,并按照建议检查每个搜索键的存在。如果密钥不存在,请为搜索的密钥类型“-m-m”添加NSMutableSet或NSMutableArray(根据您的需要),然后添加到该密钥的集合或数组中。