1

我需要滚动浏览数千个单词以对其进行分类……以确定哪些单词具有相同的模式。(这部分有效)例如,在第 2 和第 4 位置有两个 m 的四字母单词表示模式(“-mm”)。一旦我浏览了所有的单词,我就会知道任何给定的模式有多少单词。我现在正在滚动浏览,但我遇到的问题是“记住”在任何给定模式下我有多少个单词。

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

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

谢谢你

4

5 回答 5

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];
    }
}
于 2012-04-16T22:49:02.283 回答
0

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

编辑

如果您不仅想获得模式的计数,而且实际上要知道哪些单词属于该模式,我会使用字符串字典来表示可变数组。在数组中存储单词,数组的键是模式(作为字符串),与上面的代码类似,但不仅仅是增加计数,您必须将新单词添加到数组中。

于 2012-04-16T21:45:46.657 回答
0

NSDictionary 和 NSMutableDictionary 的唯一区别是可以添加对象。我认为您的实现很好,但是英语是一种复杂的语言。使用正则表达式解析字符串比为其设置键更有效。

于 2012-04-16T21:55:19.397 回答
0

你为什么不NSCountedSet改用:

NSCountedSet 类参考

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

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

然后使用:

- (NSUInteger)countForObject:(id)anObject
于 2012-04-16T21:58:12.530 回答
-1

使用 NSMutableArrays 的字典,并按照您的建议检查每个搜索键是否存在。如果键不存在,例如为搜索到的键类型“-mm”添加 NSMutableSet 或 NSMutableArray(取决于您的需要),然后添加到该键的集合或数组中。

于 2012-04-16T22:01:36.697 回答