4

私は次の NSArray を持っています:

NSArray myArray = @[@{@300:@"5 min"},
                    @{@900:@"15 min"},
                    @{@1800:@"30 min"},
                    @{@3600:@"1 hour"}];

辞書の値のリストが必要です:

@[@"5 min",@"15 min",@"30 min",@"1 hour"]

そして、私の辞書のキーのリスト:

@[@300, @900, @1800, @3600]

それを行う最善の方法は何ですか?述語について考えていたのですが、使い方がわかりません。

4

4 に答える 4

9

これをどのように進めたいかを示すコードがないと、何を求めているのかを正確に確認することは難しく、質問には少し混乱があります。

まず、述語はまさにそれです。つまり、真か偽かを証明できるステートメントです。したがって、述語は、コア データなどのデータベース クエリで暗黙的に使用されるものを含め、論理式で使用されます。

あなたの質問を正しく読めば、それはあなたが望むものではありません。必要なのは、データ モデルの複雑さを軽減し、その過程で余分な (希望する) 情報を削除することです。辞書の配列の一種の平坦化。

けっこうだ。

また、述語との混同がどのように生じたかもわかります。ほとんどの場合、述語は Key-Value Coding を使用して構築されます。KVC としても知られているように、目的を達成できる非常に強力な手法です。論理ステートメントとはあまり関係がありません。

それを解決した後、KVC を使用すると、必要なことを最小限の手間で行うことができます。こんなふうになります:

NSArray *values = [myArray valueForKeyPath: @"@unionOfArrays.@allValues"];

NSArray *keys   = [myArray valueForKeyPath: @"@unionOfArrays.@allKeys"];

簡単な説明が適切かもしれません:

私たちが望む結果は

  1. 各ディクショナリのすべての値 (またはキー) で、値 (またはキー) の配列の配列を取得します。
  2. 次に、これらの配列を 1 つの配列にフラット化します。

KVC を使用してディクショナリからすべての値 (またはキー) を取得するための特別なキーは、それぞれ@allValuesまたは@allKeysです。

この@unionOfArrays演算子は、それに続く式から取得した配列の和集合を作成します。つまり、必要な配列にフラット化します。

このコーディングの単純さに対して支払う代償は、KVC キー パスをコレクション オペレーターと共に使用する必要があることです。コレクション オペレーターは、コード内の単なる文字列です。したがって、構文に関するコンパイラからのヘルプが失われ、入力したキーがオブジェクトに存在するかどうかがチェックされません。同様に、たとえば入力ミスや間違った演算子を使用した場合、デバッガーとエラー メッセージは役に立ちません。

于 2013-08-26T12:25:34.507 に答える
1

@johnyuの回答は技術的には正しいですが、特にデータ構造が同じままである場合、2次ループを含める理由はわかりません。

NSArray *myArray = @[@{@300:@"5 min"},
                     @{@900:@"15 min"},
                     @{@1800:@"30 min"},
                     @{@3600:@"1 hour"}];

NSMutableArray *arrayOfValues = [NSMutableArray new];
NSMutableArray *arrayOfKeys = [NSMutableArray new];

for (NSDictionary *dictionary in myArray) {
    [arrayOfValues addObject:dictionary.allValues[0]];
    [arrayOfKeys addObject:dictionary.allKeys[0]];
}

NSLog(@"%@",arrayOfKeys);
NSLog(@"%@",arrayOfValues);
于 2013-08-26T12:24:32.313 に答える
0

これを試して:

NSArray *myArray = @[@{@300:@"5 min"},
                    @{@900:@"15 min"},
                    @{@1800:@"30 min"},
                    @{@3600:@"1 hour"}];
NSMutableArray *keyArray = [[NSMutableArray alloc] init];
NSMutableArray *valueArray = [[NSMutableArray alloc] init];
for (NSDictionary *dictionary in myArray) {
    for (NSString *key in dictionary) {
        [keyArray addObject:key];
        [valueArray addObject:[dictionary objectForKey:key]];
    }
}
于 2013-08-26T11:12:56.293 に答える