1

数千の単語をスクロールして分類し、同じパターンを持つ単語を特定する必要があります。(この部分が機能します) たとえば、2 番目と 4 番目の位置に 2 つの m がある 4 文字の単語は、パターン ("-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

代わりに使用してみませんかNSCountedSet:

NSCountedSet クラス リファレンス

..iOS 2.0 以降で利用できるのはどれですか?

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

次に使用します。

- (NSUInteger)countForObject:(id)anObject
于 2012-04-16T21:58:12.530 に答える
0

客観的なCの専門家ではありませんが、以前にJavaでこの問題を解決していたので、辞書(Javaでそれを行うときにマップを使用しました)が最善の方法であると言えます。キー(パターン)がすでに存在するかどうかを確認します。存在する場合はそのカウントを増やし、そうでない場合は新しいものを辞書に入れます。

編集

パターンのカウントを取得するだけでなく、実際にどの単語がそのパターンに該当するかを知りたい場合は、可変配列に対する文字列の辞書を使用します。配列に単語を格納し、配列のキーはパターン (文字列として) です。上記と同様のコードですが、カウントをインクリメントするだけでなく、新しい単語を配列に追加する必要があります。

于 2012-04-16T21:45:46.657 に答える
0

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

于 2012-04-16T21:55:19.397 に答える
-1

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

于 2012-04-16T22:01:36.697 に答える