2012-04-16 145 views
1

我需要滚动浏览数千个单词才能对它们进行分类...以确定哪些单词具有相同的模式。 (此部分起作用) 例如,第2个&第4个位置有两个m的四个字母的单词表示模式(“-m-m”)。一旦我读完所有的单词,我就会知道对于任何给定的模式有多少单词。我现在正在滚动,但是我遇到的问题是'记住'我在任何给定模式中有多少单词。NSMutableArray或NSMutableDictionary:哪种情况最适合这种情况?

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

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

谢谢

回答

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]; 
    } 
} 
+0

谢谢。你有这样的一个片段可能被实现吗?我喜欢这种方法,但我正在苦于语法。 – user1278974 2012-04-17 14:00:43

+0

我添加了一个完整的示例代码....看看它是否有帮助。顺便说一句:代码绝不是优化的! – user523234 2012-04-17 16:19:03

+0

编辑可将addOject移动到existingPatternLookup中for循环的外部。 – user523234 2012-04-18 23:32:31

0

不是作为一个目标C专家,但之前解决Java的这个问题,我会说的字典(在Java中这样做时,我用的地图)是最好的方式。检查密钥(模式)是否已经存在,如果增加了计数,则在字典中添加新密钥。

编辑

如果你想不只是得到一个模式的计数,但实际上知道哪些话该模式下倒下,我会用字符串数组可变的字典。在你存储单词的数组中,数组的键是模式(作为一个字符串),类似于上面的代码,但不是只增加计数,你必须将新单词添加到数组中。

0

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

+0

呃,我觉得这个问题是关于数组和字典,而不是可变和不可变的字典。 – Chuck 2012-04-16 22:03:11

+0

@收拾,我感觉你没有完全阅读我的答案。 – CodaFi 2012-04-16 23:43:45

0

你为什么不使用NSCountedSet代替:

NSCountedSet Class Reference

..这是提供的iOS 2.0及更高版本?

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

然后使用:

- (NSUInteger)countForObject:(id)anObject 
+1

NSCountedSet在iOS上不存在,这是本文标记的内容。 – thebarcodeproject 2012-04-16 21:59:23

+0

@thebarcodeproject根据苹果,它可用于iOS 2.0及更高版本。在评论和下调之前,你会介意检查文档吗?谢谢。 – magma 2012-04-16 22:03:56

+0

我表示抱歉,我试图通过upvote来取消我的投票,但是它不允许。如果你是因为我低估了你而低估了我的人,那是非常糟糕的形式...... – thebarcodeproject 2012-04-16 23:53:04

-1

使用NSMutableArrays的字典,并检查每个搜索关键字的存在为你推荐。如果密钥不存在,则为搜索到的密钥类型“-m-m”添加一个NSMutableSet或NSMutableArray(取决于您的需要),然后将其添加到该密钥的集合或数组中。

相关问题