2012-04-16 114 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(取決於您的需要),然後將其添加到該密鑰的集合或數組中。