0

ここ数日、私は次の問題に苦しんでいます

辞書の辞書の奥深くにキーと値を設定する必要があります。キーを設定したい辞書へのキーは知っていますが、そこに到達する方法がわかりません。キーは配列に格納されます。

たとえば、次のキーを持つ辞書があり、各キーの値は別の辞書です。

- myDict
    - A
      - A
        - A
        - B
      - B
        - A
        - B
    - B
      - A
        - A
        - B
      - B
        - A
        - B

次の配列もあります。

[A, A, B]

これは、A->A->B で辞書のキーの値を設定したいということです。これは次のようになります。

[[[[myDict objectForKey:@"A"] objectForKey:@"A"] objectForKey@"B"] setValue:myValue forKey:myKey]

これを達成できる方法を知っている人はいますか?辞書への参照を保持し、配列内のオブジェクトを反復処理して、辞書の「次のレベル」に移動し、これへの参照を保持し、配列内の最後のオブジェクトに到達したら、キーの値。私の問題は、これをやってのける方法がわからないことです。辞書への参照を保持するには、次のレベルに進むときに新しい辞書を初期化する必要がありますよね? これにより、現在のレベルのオブジェクトのみを含む新しいディクショナリが作成されるため、元のディクショナリのキーに値を設定することはありません。

コード例または疑似コードは大歓迎です。

4

3 に答える 3

1

[yourArray componentsJoinedByString:@"."]キーパスを取得してvalueForKeyPath:から、適切な値を取得するために使用するだけのように思えます。

于 2012-06-03T19:22:34.923 に答える
0

これが「正確な」答えであると言っているのではなく、このようなことをするでしょうが、正確なニーズを理解するための道を歩むはずです。

for(NSString* key in [myDict allKeys]) {

    NSString *yourValue = ....
    NSDictionary *dict = [[myDict objectForKey:key] objectForKey:key];// Will get you to A->A

    for(NSString *levelKey in [dict allKeys]) {

    //Setting Value for A->A->(A) & A->A->(B)

          [dict setValue:yourValue forKey:levelKey];      
    }

}
于 2012-06-03T18:20:49.983 に答える
0

この回答は無視してください。代わりに、@Chuck が投稿したアプローチを使用してください。

問題を解決する以下の2つの方法を書くことになりました。これは @nhahtdh にインスパイアされたものです。これらのメソッドはカテゴリに最適ですが、これまでカテゴリを作成したことがありません。いつかカテゴリにするかもしれません。誰かがそうしたいと感じたら、ここに結果を投稿してください。

/**
 *  Sets the value in a dictionary with a keypath. Uses either the first or the last key in the keypath as the key to set the value for.
 *  @param value Value to set.
 *  @param dictionary Dictionary to set the value in.
 *  @param path Path for the key. Last or first object is used as the key for the value.
 *  @param readFromEnd Whether or not to read the path from the end.
 */
 + (void)setValue:(id)value inDictionary:(NSMutableDictionary *)dictionary withKeyPath:(NSArray *)path readFromEnd:(BOOL)readFromEnd
{
    NSMutableArray *mutablePath = [NSMutableArray arrayWithArray:path];
    NSString *key;
    if (readFromEnd)
    {
        key = [mutablePath lastObject];
        [mutablePath removeLastObject];
    }
    else
    {
        key = [mutablePath objectAtIndex:0];
        [mutablePath removeObjectAtIndex:0];
    }
    [self setValue:value forKey:key inDictionary:dictionary withKeyPath:mutablePath readFromEnd:readFromEnd];
}

/**
 *  Sets the value in a dictionary with a keypath.
 *  @param value Value to set.
 *  @param key Key for the value.
 *  @param dictionary Dictionary to set the value in.
 *  @param path Path for the key.
 *  @param readFromEnd Whether or not to read the path from the end.
 */
+ (void)setValue:(id)value forKey:(NSString *)key inDictionary:(NSMutableDictionary *)dictionary withKeyPath:(NSArray *)path readFromEnd:(BOOL)readFromEnd
{
    if (path.count == 0)
        [dictionary setValue:value forKey:key];
    else
    {
        NSMutableArray *mutablePath = [NSMutableArray arrayWithArray:path];
        NSString *currentKey;
        if (readFromEnd)
        {
            currentKey = [mutablePath lastObject];
            [mutablePath removeLastObject];
        }
        else
        {
            currentKey = [mutablePath objectAtIndex:0];
            [mutablePath removeObjectAtIndex:0];
        }
        [self setValue:value forKey:key inDictionary:[dictionary objectForKey:currentKey] withKeyPath:mutablePath readFromEnd:readFromEnd];
    }
}
于 2012-06-03T19:14:27.430 に答える