2012-04-16 11 views
1

カテゴリを分類するには数千語をスクロールする必要があります...同じパターンを持つ単語を判断するには(この部分は動作します) たとえば、2番目の&番目の2つのmの4文字の単語は、パターン( "-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

+0

完全なサンプルコードを追加しました。 btw:コードは決して最適化されません! – user523234

+0

編集すると、既存のパターンルックアップのforループの外にaddOjectが移動します。 – user523234

0

が客観Cの専門家であることが、以前にJavaでこの問題を解決されないありがとう、私は辞書は(Javaでそれをやったときに、私はマップを使用)最良の方法であると言うでしょう。キー(パターン)がすでに存在するかどうかをチェックして、それ以外の場合は新しいものを辞書に入れます。

EDIT

あなただけのパターンの数を取得しますが、実際にはそのパターンに該当どの言葉伝えないようにしたい場合は、私が変更可能な配列に文字列の辞書を使用します。配列に単語とキーを格納する配列では、パターン(文字列として)は上記と同様のコードですが、カウントを増やすのではなく、新しい単語を配列に追加する必要があります。

0

NSDictionaryとNSMutableDictionaryの唯一の違いは、オブジェクトを追加できることです。あなたの実装は良いと思いますが、英語は複雑な言語です。 regexでキーを設定するよりも文字列を解析するほうが効率的です。

+0

ええと、私は質問が配列や辞書、ない可変および不変の辞書についてだと思います。 – Chuck

+0

@Chuck、私はあなたが私の答えを完全に読まなかったという沈んだ感じをします。 – CodaFi

0

は、なぜあなたは代わりにNSCountedSetを使用しないでください。

NSCountedSet Class Reference

のiOS 2.0以降で利用可能です..which?

NSCountedSetオブジェクトに挿入された個々のオブジェクトには、それに関連付けられたカウンタがあります。 NSCountedSetkeepsオブジェクトが挿入された回数のトラック[...]したがって、オブジェクトがセットに複数回追加されたとしても、NSSetオブジェクトにはオブジェクトのインスタンスは1つしかありません。スーパークラスNSSetによって定義されたcountメソッドは特別な意味を持ちます。それは、オブジェクトがセット内で表される総数ではなく、別個のオブジェクトの数を返します。

は、次に使用:

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

NSCountedSetはiOS上に存在しません。これは、この投稿にタグが付けられているものです。 – thebarcodeproject

+0

@thebarcodeproject Appleによると、iOS 2.0以降で利用可能です。コメントやダウンボートの前に、ドキュメントをチェックしてもよろしいですか?ありがとうございました。 – magma

+0

私は謝罪し、私はそれを許可しませんでしたが、私の下投票を取り消すためにupvoteしようとしました。もし私があなたを落としただけで私を落胆させた人なら、それはかなり悪い形です... – thebarcodeproject

-1

はNSMutableArraysの辞書を使用して、あなたが推奨されているように、各検索キーの存在を確認します。キーが存在しない場合は、検索されたキータイプ "-m-m"のNSMutableSetまたはNSMutableArray(必要に応じて)を追加し、そのキーのセットまたは配列に追加します。