NSMutableArray或NSMutableDictionary:这是最适合这种情况?

我需要滚动数千个单词来对它们进行分类…以确定哪些单词具有相同的模式。 (这部分工作)例如,在第二和第四位置有两个m的四个字母的单词表示一个模式(“-mm”)。 一旦我读完所有的单词,我就会知道对于任何给定的模式有多less单词。 我现在正在滚动,但是我现在遇到的问题是“记住”我在任何给定模式中有多less单词。

我正在考虑使用NSMutableDictionary,并有关键是模式('-mm-')和对象表示该模式的计数。 这意味着每当我遇到一个模式时,我会在字典中查找这个模式,获得密钥,递增密钥并将其放回到字典中。

我需要帮助完成这项任务的决定和语法。

谢谢

你的问题的答案是你的(给出的)问题的这个部分:“我将知道任何给定的模式有多less个单词”。 我会使用一个字典数组。 您可以使用字典存储键值对:已知的模式和计数。 而你使用数组来存储这些KVPlogging。 所以下一次你检测一个模式,search该logging(字典)的数组,如果find,增加计数。 如果不是,则创build新logging并将计数设置为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]; } } 

不是一个客观的C专家,而是在java中解决这个问题之前,我会说一个字典(当我用Java做的时候使用了一个地图)是最好的方法。 检查键(模式)是否已经存在,如果增加计数,则在字典中放入新的。

编辑

如果你不想只是得到一个模式的数量,但实际上告诉哪个单词属于这个模式,我会使用一个string字典的可变数组字典。 在数组中你存储的单词和数组的关键是模式(作为一个string),类似于上面的代码,而不是只增加计数,你必须添加新的单词到数组。

在NSDictionary和NSMutableDictionary唯一的区别是可以有对象添加到它。 我认为你的实施是好的,但英语是一个复杂的语言。 用正则expression式parsingstring比为它设置一个键会更高效。

为什么不用NSCountedSet

NSCountedSet类参考

..这是在iOS 2.0及更高版本中可用?

插入NSCountedSet对象的每个不同的对象都有一个与之关联的计数器。 NSCountedSetkeeps追踪对象被插入的次数[…]因此,即使对象已被多次添加到集合中,NSSet对象中也只有一个对象实例。 超类NSSet定义的count方法具有特殊意义, 它返回不同对象的数量,而不是对象在集合中表示的总次数。

然后使用:

 - (NSUInteger)countForObject:(id)anObject 

使用一个NSMutableArrays字典,并检查每个search键的存在,如你所build议的。 如果密钥不存在,则为search到的密钥types“-mm”添加一个NSMutableSet或NSMutableArray(取决于您的需要),然后添加到该密钥的集合或数组中。