1

キー/値の配列があります...

NSArray *keysAndValues = @[@"1", @"one", @"2", @"two", @"3", @"three"];

これをに変換して、NSDictionary次のような辞書に一致させる最も簡単な方法は何ですか...

NSDictionary *dict = @{@"1" : @"two", @"2" : @"two", @"3" : @"three"};

配列を循環してキー/値を抽出するだけのコードがありますが、もっとクリーンな方法や組み込みのNSDictionaryメソッドがないかどうか疑問に思っていましたか?

4

3 に答える 3

3

あなたは何も見逃していません。これを行うためにループする以外に本当に便利な方法はありません。もちろん、どのような解決策も根本的にはループしますが、NSArray(/ meは慎重に咳をし、Pythonリスト内包表記を調べる)「フィルタリング」または再配置機能が組み込まれていると便利です。

この点で、GitHub上のvikingosegundoのarraytools、または他の人による同様のコレクション操作拡張機能に役立つものがある可能性があります。これを行うために独自のカテゴリメソッドを作成しても害はありませんが、私が言ったように、どこかにループがなければなりません。

これが私の提案です。配列を列挙して分割します。

NSMutableArray * keys = [NSMutableArray array];
NSMutableArray * values = [NSMutableArray array];
[array enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop)){
    if( idx % 2 ){
        [values addObject:obj];
    else {
        [keys addObject:obj];
    }
}];

NSDictionary * d = [NSDictionary dictionaryWithObjects:values forKeys:keys];

NSIndexSetとなどを使用するなど、これを行うためのより良い方法があるはずですが、objectsAtIndexes:連続していないインデックスの束を使用してインデックスセットを作成する便利な方法はありません。

このようなもの、例えば、いいでしょう:

@implementation NSIndexSet (WSSNonContiguous)


+ (id) WSS_indexSetWithOddIndexesInRange: (NSRange)range
{
    NSMutableIndexSet * s = [NSMutableIndexSet indexSet];

    // If the start of the range is even, start with the next number.
    NSUInteger start = range.location % 2 ? range.location : range.location + 1;
    NSUInteger upper_limit = range.location + range.length;
    for( NSUInteger i = start; i < upper_limit; i += 2 ){
        [s addIndex:i];
    }

    return s;
}

+ (id) WSS_indexSetWithEvenIndexesInRange: (NSRange)range
{
    NSMutableIndexSet * s = [NSMutableIndexSet indexSet];

    // If the start of the range is odd, start with the next number.
    NSUInteger start = range.location % 2 ? range.location + 1 : range.location;
    NSUInteger upper_limit = range.location + range.length;
    for( NSUInteger i = start; i < upper_limit; i += 2 ){
        [s addIndex:i];
    }

    return s;
}

@end

ヘルパー機能付き:

NSRange rangeOfNumbers(NSUInteger start, NSUInteger end)
{
    return (NSRange){start, end-start};
}

あなたがこれを行うことができるように:

NSIndexSet * s = [NSIndexSet WSS_indexSetWithEvenIndexesInRange:rangeOfNumbers(0, 10)];
NSLog(@"%@", s);
// Prints: <NSMutableIndexSet: 0x7fccca4142a0>[number of indexes: 5 (in 5 ranges), indexes: (0 2 4 6 8)]
于 2013-01-03T20:08:42.670 に答える
3

NSDictionary には、配列から代替値を取得し、キー用と値用の 2 つのセットに分割する組み込みメソッドはありません。

次のようにする必要があります: (これはコンパイラでテストされていませんが、アイデアが得られます。)

必要に応じkey = 1object = one:

for(int i=0;i<keysAndValues.count;i+=2){
    [dict setObject:[keysAndValues objectAtIndex:i+1] forKey:[keysAndValues objectAtIndex:i]];
}
于 2013-01-03T19:45:07.813 に答える
1

配列を循環してキー/値を抽出するだけのコードがありますが、よりクリーンな方法や、欠落している組み込みの NSDictionary メソッドがあるかどうか疑問に思っていましたか?

逃げ道はありません。すべての配列を反復処理する必要があります。

よりクリーンな方法を探している場合は、おそらく Josh Caswell の回答が最適ですが、配列を反復処理する必要があります。

これは、次の方法を使用して簡単に実行できます。

+ (id)dictionaryWithObjectsAndKeys:(id)firstObject , ... 

残念ながら、配列から va_list を直接作成する方法はありません。この質問も参照してください。

于 2013-01-03T20:22:27.213 に答える