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

时间:2012-04-16 21:36:20

标签: ios

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

我正在考虑使用NSMutableDictionary,并且键是模式('-m-m-'),对象表示该模式的计数。这意味着每次遇到模式时,我都会在字典中查找该模式,获取密钥,增加密钥,然后将其放回字典中。

我需要帮助执行此任务的决策和语法。

谢谢

5 个答案:

答案 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代替:

NSCountedSet Class Reference

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

  

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

然后使用:

- (NSUInteger)countForObject:(id)anObject

答案 4 :(得分:-1)

使用NSMutableArrays的字典,并按照建议检查每个搜索键的存在。如果密钥不存在,请为搜索的密钥类型“-m-m”添加NSMutableSet或NSMutableArray(根据您的需要),然后添加到该密钥的集合或数组中。