1

NSDictionaryそれぞれの値が一意のキーの数である一意のキーを作成しようとしています。

すなわち

配列が与えられると[apple, apple, banana, apple, pear, banana]、辞書を取得します...

{
    apple : 3,
    banana : 2,
    pear : 1
}

私はあなたが次のようなことをすることができる前にコードを見たことがあると確信しています...

NSMutableArray *uniqueKeys = [NSMutableArray array];

for (NSString *string in myArray) {
    uniqueKeys[string]++;
}

しかし、正確な構文が何であるかを思い出せません。

を抽出しNSNumberて変更し、元に戻すことで、長い間それを行うことができることはわかっていますが、可能であればこの方法を使用したいと思いました。

4

2 に答える 2

5

NSCountedSetを使用できるようです。「リンゴ」と「リンゴ」が等しい場合、カウントされたセットに含まれる「果物」の数と、セットに含まれる「リンゴ」の数の両方を知ることができます。

Appleのドキュメント:

NSCountedSetクラスは、不明瞭なオブジェクトの可変で順序付けられていないコレクションへのプログラムインターフェイスを宣言します。カウントされたセットは、バッグとも呼ばれます。

NSCountedSetオブジェクトに挿入された個別のオブジェクトには、それぞれカウンターが関連付けられています。NSCountedSetは、オブジェクトが挿入された回数を追跡し、オブジェクトが同じ回数削除されることを要求します。したがって、オブジェクトがセットに複数回追加された場合でも、NSSetオブジェクトにはオブジェクトのインスタンスが1つだけあります。スーパークラスNSSetによって定義されたcountメソッドには、特別な意味があります。セット内でオブジェクトが表される合計回数ではなく、個別のオブジェクトの数を返します。NSSetクラスとNSMutableSetクラスは、要素が異なる静的セットと動的セットにそれぞれ提供されます。

アップデート

次に例を示します。

NSCountedSet * fruits = [[NSCountedSet alloc] initWithArray:@[@"apple", @"apple", @"banana", @"apple", @"pear", @"banana"]];
NSLog(@"fruit count = %d", [fruits count]);
NSLog(@"num apples = %d", [fruits countForObject:@"apple"]);
NSLog(@"num bananas = %d", [fruits countForObject:@"banana"]);
NSLog(@"num pears = %d", [fruits countForObject:@"pear"]);
NSLog(@"num oranges = %d", [fruits countForObject:@"orange"]);

出力されます:

2013-02-02 13:07:59.058 test[46614:c07] fruit count = 3
2013-02-02 13:07:59.059 test[46614:c07] num apples = 3
2013-02-02 13:07:59.062 test[46614:c07] num bananas = 2
2013-02-02 13:07:59.062 test[46614:c07] num pears = 1
2013-02-02 13:07:59.063 test[46614:c07] num oranges = 0
于 2013-02-02T18:02:17.800 に答える
1

NSCountedSetは非常に洗練されたソリューションを提供しますが、何らかの理由でセットではなく辞書が必要な場合、この「長い手」を作成するのはそれほど面倒ではありません。(たとえば、すべてのキーと値を一度にトラバースする必要がある場合に役立つことがあります)。

NSMutableDictionary *dictionaryWithKeysAndNumbers = [[NSMutableDictionary alloc] init];

for (NSString *key in keysArray) {
    if ([dictionaryWithKeysAndNumbers valueForKey:key]) {
        NSNumber *numberOfKeyInstances = [dictionaryWithKeysAndNumbers valueForKey:key];
        NSInteger newValue = numberOfKeyInstances.intValue +1;
        [dictionaryWithKeysAndNumbers setValue:[NSNumber numberWithInt:newValue] forKey:key];
    }
    else{
        [dictionaryWithKeysAndNumbers setValue:[NSNumber numberWithInt:1] forKey:key];
    }
}
于 2013-02-02T19:02:05.623 に答える